Browse Source

Minimize passing of player indexes

pull/5047/head
Anders Jenbo 4 years ago
parent
commit
56915974d6
  1. 2
      Source/inv.cpp
  2. 20
      Source/msg.cpp
  3. 2
      Source/msg.h
  4. 178
      Source/objects.cpp
  5. 4
      Source/objects.h
  6. 99
      Source/player.cpp
  7. 5
      Source/qol/autopickup.cpp
  8. 2
      Source/qol/autopickup.h
  9. 16
      Source/spells.cpp
  10. 2
      Source/spells.h

2
Source/inv.cpp

@ -2090,7 +2090,7 @@ void DoTelekinesis()
if (pcursobj != -1)
NetSendCmdParam1(true, CMD_OPOBJT, pcursobj);
if (pcursitem != -1)
NetSendCmdGItem(true, CMD_REQUESTAGITEM, MyPlayerId, MyPlayerId, pcursitem);
NetSendCmdGItem(true, CMD_REQUESTAGITEM, MyPlayerId, pcursitem);
if (pcursmonst != -1) {
auto &monter = Monsters[pcursmonst];
if (!M_Talker(monter) && monter.talkMsg == TEXT_NONE)

20
Source/msg.cpp

@ -1465,7 +1465,7 @@ size_t OnResurrect(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (message.wParam1 < MAX_PLRS) {
DoResurrect(pnum, message.wParam1);
DoResurrect(pnum, Players[message.wParam1]);
if (pnum == MyPlayerId)
pfile_update(true);
}
@ -1667,7 +1667,7 @@ size_t OnOpenDoor(const TCmd *pCmd, int pnum)
} else if (message.wParam1 < MAXOBJECTS) {
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(pnum, CMD_OPENDOOR, message.wParam1);
SyncOpObject(player, CMD_OPENDOOR, message.wParam1);
DeltaSyncObject(message.wParam1, CMD_OPENDOOR, player);
}
@ -1683,7 +1683,7 @@ size_t OnCloseDoor(const TCmd *pCmd, int pnum)
} else if (message.wParam1 < MAXOBJECTS) {
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(pnum, CMD_CLOSEDOOR, message.wParam1);
SyncOpObject(player, CMD_CLOSEDOOR, message.wParam1);
DeltaSyncObject(message.wParam1, CMD_CLOSEDOOR, player);
}
@ -1699,7 +1699,7 @@ size_t OnOperateObject(const TCmd *pCmd, int pnum)
} else if (message.wParam1 < MAXOBJECTS) {
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(pnum, CMD_OPERATEOBJ, message.wParam1);
SyncOpObject(player, CMD_OPERATEOBJ, message.wParam1);
DeltaSyncObject(message.wParam1, CMD_OPERATEOBJ, player);
}
@ -1708,15 +1708,15 @@ size_t OnOperateObject(const TCmd *pCmd, int pnum)
size_t OnPlayerOperateObject(const TCmd *pCmd, int pnum)
{
const auto &message = *reinterpret_cast<const TCmdParam2 *>(pCmd);
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (message.wParam1 < MAX_PLRS && message.wParam2 < MAXOBJECTS) {
} else if (message.wParam1 < MAXOBJECTS) {
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(message.wParam1, CMD_PLROPOBJ, message.wParam2);
DeltaSyncObject(message.wParam2, CMD_PLROPOBJ, player);
SyncOpObject(player, CMD_PLROPOBJ, message.wParam1);
DeltaSyncObject(message.wParam1, CMD_PLROPOBJ, player);
}
return sizeof(message);
@ -2791,13 +2791,13 @@ void NetSendCmdQuest(bool bHiPri, const Quest &quest)
NetSendLoPri(MyPlayerId, (byte *)&cmd, sizeof(cmd));
}
void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t mast, uint8_t pnum, uint8_t ii)
void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t pnum, uint8_t ii)
{
TCmdGItem cmd;
cmd.bCmd = bCmd;
cmd.bPnum = pnum;
cmd.bMaster = mast;
cmd.bMaster = pnum;
cmd.bLevel = GetLevelForMultiplayer(*MyPlayer);
cmd.bCursitem = ii;
cmd.dwTime = 0;

2
Source/msg.h

@ -744,7 +744,7 @@ void NetSendCmdParam2(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wPar
void NetSendCmdParam3(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3);
void NetSendCmdParam4(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3, uint16_t wParam4);
void NetSendCmdQuest(bool bHiPri, const Quest &quest);
void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t mast, uint8_t pnum, uint8_t ii);
void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t pnum, uint8_t ii);
void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position, const Item &item);
void NetSendCmdChItem(bool bHiPri, uint8_t bLoc);
void NetSendCmdDelItem(bool bHiPri, uint8_t bLoc);

178
Source/objects.cpp

@ -2179,15 +2179,20 @@ void OperateLever(int i, bool sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
void OperateBook(int pnum, Object &book)
void OperateBook(Player &player, Object &book)
{
if (book._oSelFlag == 0) {
return;
}
Player &player = Players[pnum];
book._oSelFlag = 0;
book._oAnimFrame++;
if (setlevel && setlvlnum == SL_VILEBETRAYER) {
if (!setlevel) {
return;
}
if (setlvlnum == SL_VILEBETRAYER) {
bool missileAdded = false;
for (int j = 0; j < ActiveObjectCount; j++) {
Object &questObject = Objects[ActiveObjects[j]];
@ -2207,7 +2212,7 @@ void OperateBook(int pnum, Object &book)
if (doAddMissile) {
questObject._oVar6 = 4;
ObjectAtPosition({ 35, 36 })->_oVar5++;
AddMissile(player.position.tile, target, Direction::South, MIS_RNDTELEPORT, TARGET_BOTH, pnum, 0, 0);
AddMissile(player.position.tile, target, Direction::South, MIS_RNDTELEPORT, TARGET_BOTH, player.getId(), 0, 0);
missileAdded = true;
}
}
@ -2216,13 +2221,6 @@ void OperateBook(int pnum, Object &book)
}
}
book._oSelFlag = 0;
book._oAnimFrame++;
if (!setlevel) {
return;
}
if (setlvlnum == SL_BONECHAMB) {
player._pMemSpells |= GetSpellBitmask(SPL_GUARDIAN);
if (player._pSplLvl[SPL_GUARDIAN] < MaxSpellLevel)
@ -2236,7 +2234,7 @@ void OperateBook(int pnum, Object &book)
player._pdir,
MIS_GUARDIAN,
TARGET_MONSTERS,
pnum,
player.getId(),
0,
0);
}
@ -2334,7 +2332,7 @@ void OperateChamberOfBoneBook(Object &questBook)
InitQTextMsg(textdef);
}
void OperateChest(int pnum, int i, bool sendmsg)
void OperateChest(const Player &player, int i, bool sendmsg)
{
if (Objects[i]._oSelFlag == 0) {
return;
@ -2356,7 +2354,6 @@ void OperateChest(int pnum, int i, bool sendmsg)
CreateRndUseful(Objects[i].position, sendmsg);
}
}
const Player &player = Players[pnum];
if (Objects[i].IsTrappedChest()) {
Direction mdir = GetDirection(Objects[i].position, player.position.tile);
missile_id mtype;
@ -2386,10 +2383,10 @@ void OperateChest(int pnum, int i, bool sendmsg)
Objects[i]._oTrapFlag = false;
}
if (&player == MyPlayer)
NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i);
NetSendCmdParam1(false, CMD_PLROPOBJ, i);
}
void OperateMushroomPatch(const Player &player, Object &questContainer)
void OperateMushroomPatch(const Player &player, Object &mushroomPatch)
{
if (ActiveItemCount >= MAXITEMS) {
return;
@ -2402,15 +2399,15 @@ void OperateMushroomPatch(const Player &player, Object &questContainer)
return;
}
if (questContainer._oSelFlag == 0) {
if (mushroomPatch._oSelFlag == 0) {
return;
}
questContainer._oSelFlag = 0;
questContainer._oAnimFrame++;
mushroomPatch._oSelFlag = 0;
mushroomPatch._oAnimFrame++;
PlaySfxLoc(IS_CHEST, questContainer.position);
Point pos = GetSuperItemLoc(questContainer.position);
PlaySfxLoc(IS_CHEST, mushroomPatch.position);
Point pos = GetSuperItemLoc(mushroomPatch.position);
SpawnQuestItem(IDI_MUSHROOM, pos, 0, 0);
Quests[Q_MUSHROOM]._qvar1 = QS_MUSHSPAWNED;
}
@ -2532,13 +2529,13 @@ void OperateL3Door(const Player &player, int i)
OperateL3LDoor(i, true);
}
void OperatePedistal(int pnum, int i)
void OperatePedistal(Player &player, int i)
{
if (ActiveItemCount >= MAXITEMS) {
return;
}
if (Objects[i]._oVar6 == 3 || !RemoveInventoryItemById(Players[pnum], IDI_BLDSTONE)) {
if (Objects[i]._oVar6 == 3 || !RemoveInventoryItemById(player, IDI_BLDSTONE)) {
return;
}
@ -2705,17 +2702,15 @@ void OperateShrineWeird(Player &player)
InitDiabloMsg(EMSG_SHRINE_WEIRD);
}
void OperateShrineMagical(int pnum)
void OperateShrineMagical(const Player &player)
{
const Player &player = Players[pnum];
AddMissile(
player.position.tile,
player.position.tile,
player._pdir,
MIS_MANASHIELD,
TARGET_MONSTERS,
pnum,
player.getId(),
0,
2 * leveltype);
@ -2839,17 +2834,15 @@ void OperateShrineCostOfWisdom(Player &player, spell_id spellId, diablo_message
InitDiabloMsg(message);
}
void OperateShrineCryptic(int pnum)
void OperateShrineCryptic(Player &player)
{
Player &player = Players[pnum];
AddMissile(
player.position.tile,
player.position.tile,
player._pdir,
MIS_NOVA,
TARGET_MONSTERS,
pnum,
player.getId(),
0,
2 * leveltype);
@ -2932,11 +2925,9 @@ void OperateShrineDivine(Player &player, Point spawnPosition)
InitDiabloMsg(EMSG_SHRINE_DIVINE);
}
void OperateShrineHoly(int pnum)
void OperateShrineHoly(const Player &player)
{
const Player &player = Players[pnum];
AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 2 * leveltype);
AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_MONSTERS, player.getId(), 0, 2 * leveltype);
if (&player != MyPlayer)
return;
@ -3195,10 +3186,8 @@ void OperateShrineSparkling(Player &player, Point spawnPosition)
* @param pnum The player that activated the shrine
* @param spawnPosition The position of the shrine, the portal will be placed on the side closest to the player
*/
void OperateShrineTown(int pnum, Point spawnPosition)
void OperateShrineTown(const Player &player, Point spawnPosition)
{
const Player &player = Players[pnum];
if (&player != MyPlayer)
return;
@ -3208,7 +3197,7 @@ void OperateShrineTown(int pnum, Point spawnPosition)
player._pdir,
MIS_TOWN,
TARGET_MONSTERS,
pnum,
player.getId(),
0,
0);
@ -3279,11 +3268,8 @@ void OperateShrineMurphys(Player &player)
InitDiabloMsg(EMSG_SHRINE_MURPHYS);
}
void OperateShrine(int pnum, int i, _sfx_id sType)
void OperateShrine(Player &player, Object &shrine, _sfx_id sType)
{
assert(i >= 0 && i < MAXOBJECTS);
Object &shrine = Objects[i];
if (shrine._oSelFlag == 0)
return;
@ -3299,8 +3285,6 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
shrine._oAnimFlag = true;
shrine._oAnimDelay = 1;
Player &player = Players[pnum];
switch (shrine._oVar1) {
case ShrineMysterious:
OperateShrineMysterious(player);
@ -3316,7 +3300,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
break;
case ShrineMagical:
case ShrineMagicaL2:
OperateShrineMagical(pnum);
OperateShrineMagical(player);
break;
case ShrineStone:
OperateShrineStone(player);
@ -3334,7 +3318,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
OperateShrineCostOfWisdom(player, SPL_FIREBOLT, EMSG_SHRINE_FASCINATING);
break;
case ShrineCryptic:
OperateShrineCryptic(pnum);
OperateShrineCryptic(player);
break;
case ShrineEldritch:
OperateShrineEldritch(player);
@ -3346,7 +3330,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
OperateShrineDivine(player, shrine.position);
break;
case ShrineHoly:
OperateShrineHoly(pnum);
OperateShrineHoly(player);
break;
case ShrineSacred:
OperateShrineCostOfWisdom(player, SPL_CBOLT, EMSG_SHRINE_SACRED);
@ -3391,7 +3375,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
OperateShrineSparkling(player, shrine.position);
break;
case ShrineTown:
OperateShrineTown(pnum, shrine.position);
OperateShrineTown(player, shrine.position);
break;
case ShrineShimmering:
OperateShrineShimmering(player);
@ -3405,7 +3389,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
}
if (&player == MyPlayer)
NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i);
NetSendCmdParam1(false, CMD_PLROPOBJ, shrine.GetId());
}
void OperateSkelBook(int i, bool sendmsg, bool sendLootMsg)
@ -3502,28 +3486,27 @@ int FindValidShrine()
}
}
void OperateGoatShrine(int pnum, int i, _sfx_id sType)
void OperateGoatShrine(Player &player, Object &object, _sfx_id sType)
{
SetRndSeed(Objects[i]._oRndSeed);
Objects[i]._oVar1 = FindValidShrine();
OperateShrine(pnum, i, sType);
Objects[i]._oAnimDelay = 2;
SetRndSeed(object._oRndSeed);
object._oVar1 = FindValidShrine();
OperateShrine(player, object, sType);
object._oAnimDelay = 2;
force_redraw = 255;
}
void OperateCauldron(int pnum, int i, _sfx_id sType)
void OperateCauldron(Player &player, Object &object, _sfx_id sType)
{
SetRndSeed(Objects[i]._oRndSeed);
Objects[i]._oVar1 = FindValidShrine();
OperateShrine(pnum, i, sType);
Objects[i]._oAnimFrame = 3;
Objects[i]._oAnimFlag = false;
SetRndSeed(object._oRndSeed);
object._oVar1 = FindValidShrine();
OperateShrine(player, object, sType);
object._oAnimFrame = 3;
object._oAnimFlag = false;
force_redraw = 255;
}
bool OperateFountains(int pnum, int i)
bool OperateFountains(Player &player, int i)
{
Player &player = Players[pnum];
bool applied = false;
switch (Objects[i]._otype) {
case OBJ_BLOODFTN:
@ -3571,7 +3554,7 @@ bool OperateFountains(int pnum, int i)
player._pdir,
MIS_INFRA,
TARGET_MONSTERS,
pnum,
player.getId(),
0,
2 * leveltype);
applied = true;
@ -4816,17 +4799,18 @@ int ItemMiscIdIdx(item_misc_id imiscid)
return i;
}
void OperateObject(int pnum, int i, bool teleFlag)
void OperateObject(Player &player, int i, bool teleFlag)
{
const Player &player = Players[pnum];
Object &object = Objects[i];
bool sendmsg = &player == MyPlayer;
switch (Objects[i]._otype) {
switch (object._otype) {
case OBJ_L1LDOOR:
case OBJ_L1RDOOR:
if (teleFlag) {
if (Objects[i]._otype == OBJ_L1LDOOR)
if (object._otype == OBJ_L1LDOOR)
OperateL1LDoor(i, sendmsg);
if (Objects[i]._otype == OBJ_L1RDOOR)
if (object._otype == OBJ_L1RDOOR)
OperateL1RDoor(i, sendmsg);
break;
}
@ -4836,9 +4820,9 @@ void OperateObject(int pnum, int i, bool teleFlag)
case OBJ_L2LDOOR:
case OBJ_L2RDOOR:
if (teleFlag) {
if (Objects[i]._otype == OBJ_L2LDOOR)
if (object._otype == OBJ_L2LDOOR)
OperateL2LDoor(i, sendmsg);
if (Objects[i]._otype == OBJ_L2RDOOR)
if (object._otype == OBJ_L2RDOOR)
OperateL2RDoor(i, sendmsg);
break;
}
@ -4848,9 +4832,9 @@ void OperateObject(int pnum, int i, bool teleFlag)
case OBJ_L3LDOOR:
case OBJ_L3RDOOR:
if (teleFlag) {
if (Objects[i]._otype == OBJ_L3LDOOR)
if (object._otype == OBJ_L3LDOOR)
OperateL3LDoor(i, sendmsg);
if (Objects[i]._otype == OBJ_L3RDOOR)
if (object._otype == OBJ_L3RDOOR)
OperateL3RDoor(i, sendmsg);
break;
}
@ -4860,9 +4844,9 @@ void OperateObject(int pnum, int i, bool teleFlag)
case OBJ_L5LDOOR:
case OBJ_L5RDOOR:
if (teleFlag) {
if (Objects[i]._otype == OBJ_L5LDOOR)
if (object._otype == OBJ_L5LDOOR)
OperateL5LDoor(i, sendmsg);
if (Objects[i]._otype == OBJ_L5RDOOR)
if (object._otype == OBJ_L5RDOOR)
OperateL5RDoor(i, sendmsg);
break;
}
@ -4875,10 +4859,10 @@ void OperateObject(int pnum, int i, bool teleFlag)
OperateLever(i, sendmsg);
break;
case OBJ_BOOK2L:
OperateBook(pnum, Objects[i]);
OperateBook(player, object);
break;
case OBJ_BOOK2R:
OperateChamberOfBoneBook(Objects[i]);
OperateChamberOfBoneBook(object);
break;
case OBJ_CHEST1:
case OBJ_CHEST2:
@ -4886,14 +4870,14 @@ void OperateObject(int pnum, int i, bool teleFlag)
case OBJ_TCHEST1:
case OBJ_TCHEST2:
case OBJ_TCHEST3:
OperateChest(pnum, i, sendmsg);
OperateChest(player, i, sendmsg);
break;
case OBJ_SARC:
case OBJ_L5SARC:
OperateSarc(i, sendmsg, sendmsg);
break;
case OBJ_FLAMELVR:
OperateTrapLever(Objects[i]);
OperateTrapLever(object);
break;
case OBJ_BLINDBOOK:
case OBJ_BLOODBOOK:
@ -4902,7 +4886,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
case OBJ_SHRINEL:
case OBJ_SHRINER:
OperateShrine(pnum, i, IS_MAGIC);
OperateShrine(player, object, IS_MAGIC);
break;
case OBJ_SKELBOOK:
case OBJ_BOOKSTAND:
@ -4920,16 +4904,16 @@ void OperateObject(int pnum, int i, bool teleFlag)
OperateArmorStand(i, sendmsg, sendmsg);
break;
case OBJ_GOATSHRINE:
OperateGoatShrine(pnum, i, LS_GSHRINE);
OperateGoatShrine(player, object, LS_GSHRINE);
break;
case OBJ_CAULDRON:
OperateCauldron(pnum, i, LS_CALDRON);
OperateCauldron(player, object, LS_CALDRON);
break;
case OBJ_BLOODFTN:
case OBJ_PURIFYINGFTN:
case OBJ_MURKYFTN:
case OBJ_TEARFTN:
OperateFountains(pnum, i);
OperateFountains(player, i);
break;
case OBJ_STORYBOOK:
case OBJ_L5BOOKS:
@ -4937,14 +4921,14 @@ void OperateObject(int pnum, int i, bool teleFlag)
OperateStoryBook(i);
break;
case OBJ_PEDISTAL:
OperatePedistal(pnum, i);
OperatePedistal(player, i);
break;
case OBJ_WARWEAP:
case OBJ_WEAPONRACK:
OperateWeaponRack(i, sendmsg, sendmsg);
break;
case OBJ_MUSHPATCH:
OperateMushroomPatch(player, Objects[i]);
OperateMushroomPatch(player, object);
break;
case OBJ_LAZSTAND:
if (sendmsg)
@ -4954,7 +4938,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
OperateSlainHero(player, i);
break;
case OBJ_SIGNCHEST:
OperateInnSignChest(player, Objects[i]);
OperateInnSignChest(player, object);
break;
default:
break;
@ -5041,12 +5025,12 @@ void DeltaSyncOpObject(int cmd, int i)
}
}
void SyncOpObject(int pnum, int cmd, int i)
void SyncOpObject(Player &player, int cmd, int i)
{
const Player &player = Players[pnum];
Object &object = Objects[i];
bool sendmsg = &player == MyPlayer;
switch (Objects[i]._otype) {
switch (object._otype) {
case OBJ_L1LDOOR:
case OBJ_L1RDOOR:
if (!sendmsg)
@ -5078,7 +5062,7 @@ void SyncOpObject(int pnum, int cmd, int i)
case OBJ_TCHEST1:
case OBJ_TCHEST2:
case OBJ_TCHEST3:
OperateChest(pnum, i, false);
OperateChest(player, i, false);
break;
case OBJ_SARC:
case OBJ_L5SARC:
@ -5091,7 +5075,7 @@ void SyncOpObject(int pnum, int cmd, int i)
break;
case OBJ_SHRINEL:
case OBJ_SHRINER:
OperateShrine(pnum, i, IS_MAGIC);
OperateShrine(player, object, IS_MAGIC);
break;
case OBJ_SKELBOOK:
case OBJ_BOOKSTAND:
@ -5109,14 +5093,14 @@ void SyncOpObject(int pnum, int cmd, int i)
OperateArmorStand(i, sendmsg, false);
break;
case OBJ_GOATSHRINE:
OperateGoatShrine(pnum, i, LS_GSHRINE);
OperateGoatShrine(player, object, LS_GSHRINE);
break;
case OBJ_CAULDRON:
OperateCauldron(pnum, i, LS_CALDRON);
OperateCauldron(player, object, LS_CALDRON);
break;
case OBJ_MURKYFTN:
case OBJ_TEARFTN:
OperateFountains(pnum, i);
OperateFountains(player, i);
break;
case OBJ_STORYBOOK:
case OBJ_L5BOOKS:
@ -5124,20 +5108,20 @@ void SyncOpObject(int pnum, int cmd, int i)
OperateStoryBook(i);
break;
case OBJ_PEDISTAL:
OperatePedistal(pnum, i);
OperatePedistal(player, i);
break;
case OBJ_WARWEAP:
case OBJ_WEAPONRACK:
OperateWeaponRack(i, sendmsg, false);
break;
case OBJ_MUSHPATCH:
OperateMushroomPatch(player, Objects[i]);
OperateMushroomPatch(player, object);
break;
case OBJ_SLAINHERO:
OperateSlainHero(player, i);
break;
case OBJ_SIGNCHEST:
OperateInnSignChest(player, Objects[i]);
OperateInnSignChest(player, object);
break;
default:
break;

4
Source/objects.h

@ -305,8 +305,8 @@ void MonstCheckDoors(Monster &monster);
void ObjChangeMap(int x1, int y1, int x2, int y2);
void ObjChangeMapResync(int x1, int y1, int x2, int y2);
int ItemMiscIdIdx(item_misc_id imiscid);
void OperateObject(int pnum, int i, bool TeleFlag);
void SyncOpObject(int pnum, int cmd, int i);
void OperateObject(Player &player, int i, bool TeleFlag);
void SyncOpObject(Player &player, int cmd, int i);
void BreakObjectMissile(Object &object);
void BreakObject(const Player &player, Object &object);
void DeltaSyncOpObject(int cmd, int i);

99
Source/player.cpp

@ -170,7 +170,7 @@ struct DirectionSettings {
DisplacementOf<int8_t> map;
ScrollDirection scrollDir;
PLR_MODE walkMode;
void (*walkModeHandler)(int, const DirectionSettings &);
void (*walkModeHandler)(Player &, const DirectionSettings &);
};
/** Specifies the frame of each animation for which an action is triggered, for each player class. */
@ -222,33 +222,31 @@ void PmChangeLightOff(Player &player)
ChangeLightOffset(player._plid, { x, y });
}
void WalkNorthwards(int pnum, const DirectionSettings &walkParams)
void WalkNorthwards(Player &player, const DirectionSettings &walkParams)
{
Player &player = Players[pnum];
dPlayer[player.position.future.x][player.position.future.y] = -(pnum + 1);
dPlayer[player.position.future.x][player.position.future.y] = -(player.getId() + 1);
player.position.temp = player.position.tile + walkParams.tileAdd;
}
void WalkSouthwards(int pnum, const DirectionSettings & /*walkParams*/)
void WalkSouthwards(Player &player, const DirectionSettings & /*walkParams*/)
{
Player &player = Players[pnum];
dPlayer[player.position.tile.x][player.position.tile.y] = -(pnum + 1);
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] = pnum + 1;
dPlayer[player.position.tile.x][player.position.tile.y] = playerId + 1;
// BUGFIX: missing `if (leveltype != DTYPE_TOWN) {` for call to ChangeLightXY and PM_ChangeLightOff.
ChangeLightXY(player._plid, player.position.tile);
PmChangeLightOff(player);
}
void WalkSideways(int pnum, const DirectionSettings &walkParams)
void WalkSideways(Player &player, const DirectionSettings &walkParams)
{
Player &player = Players[pnum];
Point const nextPosition = player.position.tile + walkParams.map;
dPlayer[player.position.tile.x][player.position.tile.y] = -(pnum + 1);
dPlayer[player.position.future.x][player.position.future.y] = pnum + 1;
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;
if (leveltype != DTYPE_TOWN) {
ChangeLightXY(player._plid, nextPosition);
@ -318,9 +316,8 @@ bool PlrDirOK(const Player &player, Direction dir)
return true;
}
void HandleWalkMode(int pnum, Displacement vel, Direction dir)
void HandleWalkMode(Player &player, Displacement vel, Direction dir)
{
Player &player = Players[pnum];
const auto &dirModeParams = WalkSettings[static_cast<size_t>(dir)];
SetPlayerOld(player);
if (!PlrDirOK(player, dir)) {
@ -335,7 +332,7 @@ void HandleWalkMode(int pnum, Displacement vel, Direction dir)
ScrollViewPort(player, dirModeParams.scrollDir);
}
dirModeParams.walkModeHandler(pnum, dirModeParams);
dirModeParams.walkModeHandler(player, dirModeParams);
player.position.velocity = vel;
player.tempDirection = dirModeParams.dir;
@ -358,16 +355,14 @@ void StartWalkAnimation(Player &player, Direction dir, bool pmWillBeCalled)
/**
* @brief Start moving a player to a new tile
*/
void StartWalk(int pnum, Displacement vel, Direction dir, bool pmWillBeCalled)
void StartWalk(Player &player, Displacement vel, Direction dir, bool pmWillBeCalled)
{
Player &player = Players[pnum];
if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) {
SyncPlrKill(player, -1);
return;
}
HandleWalkMode(pnum, vel, dir);
HandleWalkMode(player, vel, dir);
StartWalkAnimation(player, dir, pmWillBeCalled);
}
@ -633,13 +628,8 @@ void InitLevelChange(Player &player)
/**
* @brief Continue movement towards new tile
*/
bool DoWalk(int pnum, int variant)
bool DoWalk(Player &player, int variant)
{
if (pnum < 0 || pnum >= MAX_PLRS) {
app_fatal(StrCat("PM_DoWalk: illegal player ", pnum));
}
Player &player = Players[pnum];
// Play walking sound effect on certain animation frames
if (*sgOptions.Audio.walkingSound && (leveltype != DTYPE_TOWN || sgGameInitInfo.bRunInTown == 0)) {
if (player.AnimInfo.currentFrame == 0
@ -656,7 +646,7 @@ bool DoWalk(int pnum, 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] = pnum + 1;
dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1;
break;
case PM_WALK_SOUTHWARDS:
dPlayer[player.position.temp.x][player.position.temp.y] = 0;
@ -665,7 +655,7 @@ bool DoWalk(int pnum, 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] = pnum + 1;
dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1;
break;
}
@ -693,7 +683,7 @@ bool DoWalk(int pnum, int variant)
ChangeLightOffset(player._plid, { 0, 0 });
}
AutoPickup(pnum);
AutoPickup(player);
return true;
} // We didn't reach new tile so update player's "sub-tile" position
ChangeOffset(player);
@ -1035,13 +1025,8 @@ bool PlrHitObj(const Player &player, Object &targetObject)
return false;
}
bool DoAttack(int pnum)
bool DoAttack(Player &player)
{
if (pnum < 0 || pnum >= MAX_PLRS) {
app_fatal(StrCat("PM_DoAttack: illegal player ", pnum));
}
Player &player = Players[pnum];
if (player.AnimInfo.currentFrame == player._pAFNum - 2) {
PlaySfxLoc(PS_SWING, player.position.tile);
}
@ -1061,11 +1046,12 @@ bool DoAttack(int pnum)
}
if (!gbIsHellfire || !HasAllOf(player._pIFlags, ItemSpecialEffect::FireDamage | ItemSpecialEffect::LightningDamage)) {
const size_t playerId = player.getId();
if (HasAnyOf(player._pIFlags, ItemSpecialEffect::FireDamage)) {
AddMissile(position, { 1, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, pnum, 0, 0);
AddMissile(position, { 1, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, playerId, 0, 0);
}
if (HasAnyOf(player._pIFlags, ItemSpecialEffect::LightningDamage)) {
AddMissile(position, { 2, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, pnum, 0, 0);
AddMissile(position, { 2, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, playerId, 0, 0);
}
}
@ -1370,13 +1356,8 @@ void TryDisarm(const Player &player, Object &object)
}
}
void CheckNewPath(int pnum, bool pmWillBeCalled)
void CheckNewPath(Player &player, bool pmWillBeCalled)
{
if (pnum < 0 || pnum >= MAX_PLRS) {
app_fatal(StrCat("CheckNewPath: illegal player ", pnum));
}
Player &player = Players[pnum];
int x = 0;
int y = 0;
@ -1461,28 +1442,28 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
switch (player.walkpath[0]) {
case WALK_N:
StartWalk(pnum, { 0, -xvel }, Direction::North, pmWillBeCalled);
StartWalk(player, { 0, -xvel }, Direction::North, pmWillBeCalled);
break;
case WALK_NE:
StartWalk(pnum, { xvel, -yvel }, Direction::NorthEast, pmWillBeCalled);
StartWalk(player, { xvel, -yvel }, Direction::NorthEast, pmWillBeCalled);
break;
case WALK_E:
StartWalk(pnum, { xvel3, 0 }, Direction::East, pmWillBeCalled);
StartWalk(player, { xvel3, 0 }, Direction::East, pmWillBeCalled);
break;
case WALK_SE:
StartWalk(pnum, { xvel, yvel }, Direction::SouthEast, pmWillBeCalled);
StartWalk(player, { xvel, yvel }, Direction::SouthEast, pmWillBeCalled);
break;
case WALK_S:
StartWalk(pnum, { 0, xvel }, Direction::South, pmWillBeCalled);
StartWalk(player, { 0, xvel }, Direction::South, pmWillBeCalled);
break;
case WALK_SW:
StartWalk(pnum, { -xvel, yvel }, Direction::SouthWest, pmWillBeCalled);
StartWalk(player, { -xvel, yvel }, Direction::SouthWest, pmWillBeCalled);
break;
case WALK_W:
StartWalk(pnum, { -xvel3, 0 }, Direction::West, pmWillBeCalled);
StartWalk(player, { -xvel3, 0 }, Direction::West, pmWillBeCalled);
break;
case WALK_NW:
StartWalk(pnum, { -xvel, -yvel }, Direction::NorthWest, pmWillBeCalled);
StartWalk(player, { -xvel, -yvel }, Direction::NorthWest, pmWillBeCalled);
break;
}
@ -1572,7 +1553,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
d = GetDirection(player.position.tile, object->position);
StartAttack(player, d);
} else {
OperateObject(pnum, targetId, false);
OperateObject(player, targetId, false);
}
}
break;
@ -1583,13 +1564,13 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
StartAttack(player, d);
} else {
TryDisarm(player, *object);
OperateObject(pnum, targetId, false);
OperateObject(player, targetId, false);
}
}
break;
case ACTION_OPERATETK:
if (object->_oBreak != 1) {
OperateObject(pnum, targetId, true);
OperateObject(player, targetId, true);
}
break;
case ACTION_PICKUPITEM:
@ -1597,7 +1578,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
x = abs(player.position.tile.x - item->position.x);
y = abs(player.position.tile.y - item->position.y);
if (x <= 1 && y <= 1 && pcurs == CURSOR_HAND && !item->_iRequest) {
NetSendCmdGItem(true, CMD_REQUESTGITEM, pnum, pnum, targetId);
NetSendCmdGItem(true, CMD_REQUESTGITEM, player.getId(), targetId);
item->_iRequest = true;
}
}
@ -1607,7 +1588,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
x = abs(player.position.tile.x - item->position.x);
y = abs(player.position.tile.y - item->position.y);
if (x <= 1 && y <= 1 && pcurs == CURSOR_HAND) {
NetSendCmdGItem(true, CMD_REQUESTAGITEM, pnum, pnum, targetId);
NetSendCmdGItem(true, CMD_REQUESTAGITEM, player.getId(), targetId);
}
}
break;
@ -3267,10 +3248,10 @@ void ProcessPlayers()
case PM_WALK_NORTHWARDS:
case PM_WALK_SOUTHWARDS:
case PM_WALK_SIDEWAYS:
tplayer = DoWalk(pnum, player._pmode);
tplayer = DoWalk(player, player._pmode);
break;
case PM_ATTACK:
tplayer = DoAttack(pnum);
tplayer = DoAttack(player);
break;
case PM_RATTACK:
tplayer = DoRangeAttack(player);
@ -3288,7 +3269,7 @@ void ProcessPlayers()
tplayer = DoDeath(player);
break;
}
CheckNewPath(pnum, tplayer);
CheckNewPath(player, tplayer);
} while (tplayer);
player.previewCelSprite = std::nullopt;

5
Source/qol/autopickup.cpp

@ -73,9 +73,8 @@ bool DoPickup(Item item)
} // namespace
void AutoPickup(int pnum)
void AutoPickup(const Player &player)
{
const Player &player = Players[pnum];
if (&player != MyPlayer)
return;
if (leveltype == DTYPE_TOWN && !*sgOptions.Gameplay.autoPickupInTown)
@ -87,7 +86,7 @@ void AutoPickup(int pnum)
int itemIndex = dItem[tile.x][tile.y] - 1;
auto &item = Items[itemIndex];
if (DoPickup(item)) {
NetSendCmdGItem(true, CMD_REQUESTAGITEM, pnum, pnum, itemIndex);
NetSendCmdGItem(true, CMD_REQUESTAGITEM, player.getId(), itemIndex);
item._iRequest = true;
}
}

2
Source/qol/autopickup.h

@ -8,6 +8,6 @@
namespace devilution {
void AutoPickup(int pnum);
void AutoPickup(const Player &player);
} // namespace devilution

16
Source/spells.cpp

@ -64,10 +64,8 @@ void ClearReadiedSpell(Player &player)
}
}
void PlacePlayer(int pnum)
void PlacePlayer(Player &player)
{
Player &player = Players[pnum];
if (!player.isOnActiveLevel())
return;
@ -98,7 +96,7 @@ void PlacePlayer(int pnum)
player.position.tile = newPosition;
dPlayer[newPosition.x][newPosition.y] = pnum + 1;
dPlayer[newPosition.x][newPosition.y] = player.getId() + 1;
if (&player == MyPlayer) {
ViewPosition = newPosition;
@ -257,14 +255,8 @@ void CastSpell(int id, spell_id spl, int sx, int sy, int dx, int dy, int spllvl)
}
}
void DoResurrect(int pnum, uint16_t rid)
void DoResurrect(int pnum, Player &target)
{
if ((pnum < 0 && pnum >= MAX_PLRS) || rid >= MAX_PLRS) {
return;
}
auto &target = Players[rid];
AddMissile(target.position.tile, target.position.tile, Direction::South, MIS_RESURRECTBEAM, TARGET_MONSTERS, pnum, 0, 0);
if (target._pHitPoints != 0)
@ -280,7 +272,7 @@ void DoResurrect(int pnum, uint16_t rid)
ClrPlrPath(target);
target.destAction = ACTION_NONE;
target._pInvincible = false;
PlacePlayer(rid);
PlacePlayer(target);
int hp = 10 << 6;
if (target._pMaxHPBase < (10 << 6)) {

2
Source/spells.h

@ -37,7 +37,7 @@ void CastSpell(int id, spell_id spl, int sx, int sy, int dx, int dy, int spllvl)
* @param pnum player index
* @param rid target player index
*/
void DoResurrect(int pnum, uint16_t rid);
void DoResurrect(int pnum, Player &target);
void DoHealOther(const Player &caster, Player &target);
int GetSpellBookLevel(spell_id s);
int GetSpellStaffLevel(spell_id s);

Loading…
Cancel
Save