Browse Source

Minimize propegation of global Players index

dyn-players-param2
Anders Jenbo 4 years ago
parent
commit
f166c249b6
  1. 6
      Source/diablo.cpp
  2. 23
      Source/engine/render/scrollrt.cpp
  3. 21
      Source/missiles.cpp
  4. 2
      Source/missiles.h
  5. 7
      Source/msg.cpp
  6. 157
      Source/objects.cpp
  7. 2
      Source/objects.h
  8. 2
      Source/player.cpp

6
Source/diablo.cpp

@ -1897,11 +1897,11 @@ bool TryIconCurs()
if (pcurs == CURSOR_TELEPORT) {
if (pcursmonst != -1)
NetSendCmdParam3(true, CMD_TSPELLID, pcursmonst, myPlayer._pTSpell, GetSpellLevel(MyPlayerId, myPlayer._pTSpell));
NetSendCmdParam3(true, CMD_TSPELLID, pcursmonst, myPlayer._pTSpell, GetSpellLevel(myPlayer, myPlayer._pTSpell));
else if (pcursplr != -1)
NetSendCmdParam3(true, CMD_TSPELLPID, pcursplr, myPlayer._pTSpell, GetSpellLevel(MyPlayerId, myPlayer._pTSpell));
NetSendCmdParam3(true, CMD_TSPELLPID, pcursplr, myPlayer._pTSpell, GetSpellLevel(myPlayer, myPlayer._pTSpell));
else
NetSendCmdLocParam2(true, CMD_TSPELLXY, cursPosition, myPlayer._pTSpell, GetSpellLevel(MyPlayerId, myPlayer._pTSpell));
NetSendCmdLocParam2(true, CMD_TSPELLXY, cursPosition, myPlayer._pTSpell, GetSpellLevel(myPlayer, myPlayer._pTSpell));
NewCursor(CURSOR_HAND);
return true;
}

23
Source/engine/render/scrollrt.cpp

@ -500,21 +500,18 @@ void DrawPlayerIcons(const Surface &out, Player &player, Point position, bool in
/**
* @brief Render a player sprite
* @param out Output buffer
* @param pnum Player id
* @param tilePosition dPiece coordinates
* @param targetBufferPosition Output buffer coordinates
* @param pCelBuff sprite buffer
* @param nCel frame
* @param nWidth width
*/
void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBufferPosition)
void DrawPlayer(const Surface &out, Player &player, Point tilePosition, Point targetBufferPosition)
{
if (!IsTileLit(tilePosition) && !MyPlayer->_pInfraFlag && leveltype != DTYPE_TOWN) {
return;
}
Player &player = Players[pnum];
std::optional<CelSprite> sprite = player.AnimInfo.celSprite;
int nCel = player.AnimInfo.GetFrameToUseForRendering();
@ -524,7 +521,7 @@ void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBu
}
if (!sprite) {
Log("Drawing player {} \"{}\": NULL CelSprite", pnum, player._pName);
Log("Drawing player {} \"{}\": NULL CelSprite", std::distance(Players, &player), player._pName);
return;
}
@ -537,7 +534,7 @@ void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBu
szMode = PlayerModeNames[player._pmode];
Log(
"Drawing player {} \"{}\" {}: facing {}, frame {} of {}",
pnum,
std::distance(Players, &player),
player._pName,
szMode,
DirectionToString(player._pdir),
@ -546,10 +543,10 @@ void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBu
return;
}
if (pnum == pcursplr)
if (pcursplr >= 0 && pcursplr < MAX_PLRS && &player == &Players[pcursplr])
Cl2DrawOutline(out, 165, spriteBufferPosition.x, spriteBufferPosition.y, *sprite, nCel);
if (pnum == MyPlayerId) {
if (&player == MyPlayer) {
Cl2Draw(out, spriteBufferPosition.x, spriteBufferPosition.y, *sprite, nCel);
DrawPlayerIcons(out, player, targetBufferPosition, false);
return;
@ -588,7 +585,7 @@ void DrawDeadPlayer(const Surface &out, Point tilePosition, Point targetBufferPo
if (player.plractive && player._pHitPoints == 0 && player.isOnActiveLevel() && player.position.tile == tilePosition) {
dFlags[tilePosition.x][tilePosition.y] |= DungeonFlag::DeadPlayer;
const Point playerRenderPosition { targetBufferPosition + player.position.offset };
DrawPlayer(out, i, tilePosition, playerRenderPosition);
DrawPlayer(out, player, tilePosition, playerRenderPosition);
}
}
}
@ -803,10 +800,8 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe
* @param tilePosition dPiece coordinates
* @param targetBufferPosition Output buffer coordinates
*/
void DrawPlayerHelper(const Surface &out, int p, Point tilePosition, Point targetBufferPosition)
void DrawPlayerHelper(const Surface &out, Player &player, Point tilePosition, Point targetBufferPosition)
{
Player &player = Players[p];
Displacement offset = player.position.offset;
if (player.IsWalking()) {
offset = GetOffsetForWalking(player.AnimInfo, player._pdir);
@ -814,7 +809,7 @@ void DrawPlayerHelper(const Surface &out, int p, Point tilePosition, Point targe
const Point playerRenderPosition { targetBufferPosition + offset };
DrawPlayer(out, p, tilePosition, playerRenderPosition);
DrawPlayer(out, player, tilePosition, playerRenderPosition);
}
/**
@ -876,7 +871,7 @@ void DrawDungeon(const Surface &out, Point tilePosition, Point targetBufferPosit
}
int8_t playerId = dPlayer[tilePosition.x][tilePosition.y];
if (playerId > 0 && playerId <= MAX_PLRS) {
DrawPlayerHelper(out, abs(playerId) - 1, tilePosition, targetBufferPosition);
DrawPlayerHelper(out, Players[abs(playerId) - 1], tilePosition, targetBufferPosition);
}
if (dMonster[tilePosition.x][tilePosition.y] > 0) {
DrawMonsterHelper(out, tilePosition, targetBufferPosition);

21
Source/missiles.cpp

@ -262,10 +262,9 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, missile_id t
return true;
}
bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, missile_id mtype, bool shift, bool *blocked)
bool Plr2PlrMHit(Player &player, int p, int mindam, int maxdam, int dist, missile_id mtype, bool shift, bool *blocked)
{
Player &player = Players[pnum];
auto &target = Players[p];
Player &target = Players[p];
if (sgGameInitInfo.bFriendlyFire == 0 && player.friendlyMode)
return false;
@ -342,7 +341,7 @@ bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, missile_id m
dam /= 2;
if (resper > 0) {
dam -= (dam * resper) / 100;
if (pnum == MyPlayerId)
if (&player == MyPlayer)
NetSendCmdDamage(true, p, dam);
target.Say(HeroSpeech::ArghClang);
return true;
@ -352,7 +351,7 @@ bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, missile_id m
StartPlrBlock(p, GetDirection(target.position.tile, player.position.tile));
*blocked = true;
} else {
if (pnum == MyPlayerId)
if (&player == MyPlayer)
NetSendCmdDamage(true, p, dam);
StartPlrHit(p, dam, false);
}
@ -415,7 +414,7 @@ void CheckMissileCol(Missile &missile, int minDamage, int maxDamage, bool isDama
if (missile._micaster != TARGET_BOTH && !missile.IsTrap()) {
if (missile._micaster == TARGET_MONSTERS) {
if ((pid - 1) != missile._misource)
isPlayerHit = Plr2PlrMHit(missile._misource, pid - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted, &blocked);
isPlayerHit = Plr2PlrMHit(Player[missile._misource], pid - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted, &blocked);
} else {
Monster &monster = Monsters[missile._misource];
isPlayerHit = PlayerMHit(pid - 1, &monster, missile._midist, minDamage, maxDamage, missile._mitype, isDamageShifted, 0, &blocked);
@ -601,7 +600,7 @@ bool GuardianTryFireAt(Missile &missile, Point target)
return false;
Direction dir = GetDirection(position, target);
AddMissile(position, target, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile._misource, missile._midam, GetSpellLevel(missile._misource, SPL_FIREBOLT), &missile);
AddMissile(position, target, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile._misource, missile._midam, GetSpellLevel(Players[missile._misource], SPL_FIREBOLT), &missile);
SetMissDir(missile, 2);
missile.var2 = 3;
@ -803,13 +802,11 @@ void GetDamageAmt(int i, int *mind, int *maxd)
}
}
int GetSpellLevel(int playerId, spell_id sn)
int GetSpellLevel(Player &player, spell_id sn)
{
if (playerId != MyPlayerId)
if (&player != MyPlayer)
return 1; // BUGFIX spell level will be wrong in multiplayer
Player &player = Players[playerId];
return std::max(player._pISplLvlAdd + player._pSplLvl[sn], 0);
}
@ -1166,7 +1163,7 @@ void AddBerserk(Missile &missile, const AddMissileParameter &parameter)
if (targetMonsterPosition) {
auto &monster = Monsters[abs(dMonster[targetMonsterPosition->x][targetMonsterPosition->y]) - 1];
int slvl = GetSpellLevel(missile._misource, SPL_BERSERK);
int slvl = GetSpellLevel(Players[missile._misource], SPL_BERSERK);
monster._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM;
monster.mMinDamage = (GenerateRnd(10) + 120) * monster.mMinDamage / 100 + slvl;
monster.mMaxDamage = (GenerateRnd(10) + 120) * monster.mMaxDamage / 100 + slvl;

2
Source/missiles.h

@ -138,7 +138,7 @@ extern std::list<Missile> Missiles;
extern bool MissilePreFlag;
void GetDamageAmt(int i, int *mind, int *maxd);
int GetSpellLevel(int playerId, spell_id sn);
int GetSpellLevel(Player &player, spell_id sn);
/**
* @brief Returns the direction a vector from p1(x1, y1) to p2(x2, y2) is pointing to.

7
Source/msg.cpp

@ -2030,14 +2030,13 @@ DWORD OnDebug(const TCmd *pCmd)
return sizeof(*pCmd);
}
DWORD OnNova(const TCmd *pCmd, int pnum)
DWORD OnNova(const TCmd *pCmd, Player &player)
{
const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1) {
Player &player = Players[pnum];
if (player.isOnActiveLevel() && pnum != MyPlayerId && InDungeonBounds(position)) {
if (player.isOnActiveLevel() && &player != MyPlayer && InDungeonBounds(position)) {
ClrPlrPath(player);
player._pSpell = SPL_NOVA;
player._pSplType = RSPLTYPE_INVALID;
@ -3060,7 +3059,7 @@ uint32_t ParseCmd(int pnum, const TCmd *pCmd)
case CMD_CHEAT_SPELL_LEVEL:
return OnCheatSpellLevel(pCmd, pnum);
case CMD_NOVA:
return OnNova(pCmd, pnum);
return OnNova(pCmd, player);
case CMD_SETSHIELD:
return OnSetShield(pCmd, player);
case CMD_REMSHIELD:

157
Source/objects.cpp

@ -2093,20 +2093,20 @@ void OperateL5LDoor(int oi, bool sendflag)
}
}
void OperateL1Door(int pnum, int i)
void OperateL1Door(Player &player, int i)
{
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y);
int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L1LDOOR)
OperateL1LDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L1RDOOR)
OperateL1RDoor(i, true);
}
void OperateL5Door(int pnum, int i)
void OperateL5Door(Player &player, int i)
{
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y);
int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L5LDOOR)
OperateL5LDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L5RDOOR)
@ -2377,15 +2377,15 @@ void OperateChest(int pnum, int i, bool sendmsg)
NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i);
}
void OperateMushroomPatch(int pnum, Object &questContainer)
void OperateMushroomPatch(Player &player, Object &questContainer)
{
if (ActiveItemCount >= MAXITEMS) {
return;
}
if (Quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE) {
if (pnum == MyPlayerId) {
Players[pnum].Say(HeroSpeech::ICantUseThisYet);
if (&player == MyPlayer) {
player.Say(HeroSpeech::ICantUseThisYet);
}
return;
}
@ -2403,15 +2403,15 @@ void OperateMushroomPatch(int pnum, Object &questContainer)
Quests[Q_MUSHROOM]._qvar1 = QS_MUSHSPAWNED;
}
void OperateInnSignChest(int pnum, Object &questContainer)
void OperateInnSignChest(Player &player, Object &questContainer)
{
if (ActiveItemCount >= MAXITEMS) {
return;
}
if (Quests[Q_LTBANNER]._qvar1 != 2) {
if (pnum == MyPlayerId) {
Players[pnum].Say(HeroSpeech::ICantOpenThisYet);
if (&player == MyPlayer) {
player.Say(HeroSpeech::ICantOpenThisYet);
}
return;
}
@ -2428,15 +2428,13 @@ void OperateInnSignChest(int pnum, Object &questContainer)
SpawnQuestItem(IDI_BANNER, pos, 0, 0);
}
void OperateSlainHero(int pnum, int i)
void OperateSlainHero(Player &player, int i)
{
if (Objects[i]._oSelFlag == 0) {
return;
}
Objects[i]._oSelFlag = 0;
Player &player = Players[pnum];
if (player._pClass == HeroClass::Warrior) {
CreateMagicArmor(Objects[i].position, ItemType::HeavyArmor, ICURS_BREAST_PLATE, true, false);
} else if (player._pClass == HeroClass::Rogue) {
@ -2451,7 +2449,7 @@ void OperateSlainHero(int pnum, int i)
CreateMagicWeapon(Objects[i].position, ItemType::Axe, ICURS_BATTLE_AXE, true, false);
}
MyPlayer->Say(HeroSpeech::RestInPeaceMyFriend);
if (pnum == MyPlayerId)
if (&player == MyPlayer)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
@ -2483,7 +2481,7 @@ void OperateTrapLever(Object &flameLever)
}
}
void OperateSarc(int pnum, int i, bool sendmsg)
void OperateSarc(int i, bool sendMsg, bool sendLootMsg)
{
if (Objects[i]._oSelFlag == 0) {
return;
@ -2495,27 +2493,27 @@ void OperateSarc(int pnum, int i, bool sendmsg)
Objects[i]._oAnimDelay = 3;
SetRndSeed(Objects[i]._oRndSeed);
if (Objects[i]._oVar1 <= 2)
CreateRndItem(Objects[i].position, false, sendmsg, false);
CreateRndItem(Objects[i].position, false, sendLootMsg, false);
if (Objects[i]._oVar1 >= 8)
SpawnSkeleton(Objects[i]._oVar2, Objects[i].position);
if (pnum == MyPlayerId)
if (sendMsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
void OperateL2Door(int pnum, int i)
void OperateL2Door(Player &player, int i)
{
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y);
int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L2LDOOR)
OperateL2LDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L2RDOOR)
OperateL2RDoor(i, true);
}
void OperateL3Door(int pnum, int i)
void OperateL3Door(Player &player, int i)
{
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y);
int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L3RDOOR)
OperateL3RDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L3LDOOR)
@ -3396,7 +3394,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i);
}
void OperateSkelBook(int pnum, int i, bool sendmsg)
void OperateSkelBook(int i, bool sendmsg, bool sendLootMsg)
{
if (Objects[i]._oSelFlag == 0) {
return;
@ -3407,14 +3405,14 @@ void OperateSkelBook(int pnum, int i, bool sendmsg)
Objects[i]._oAnimFrame += 2;
SetRndSeed(Objects[i]._oRndSeed);
if (GenerateRnd(5) != 0)
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_SCROLL, sendmsg, false);
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_SCROLL, sendLootMsg, false);
else
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendmsg, false);
if (pnum == MyPlayerId)
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendLootMsg, false);
if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
void OperateBookCase(int pnum, int i, bool sendmsg)
void OperateBookCase(int i, bool sendmsg, bool sendLootMsg)
{
if (Objects[i]._oSelFlag == 0) {
return;
@ -3424,7 +3422,7 @@ void OperateBookCase(int pnum, int i, bool sendmsg)
Objects[i]._oSelFlag = 0;
Objects[i]._oAnimFrame -= 2;
SetRndSeed(Objects[i]._oRndSeed);
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendmsg, false);
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendLootMsg, false);
if (Quests[Q_ZHAR].IsAvailable()) {
auto &zhar = Monsters[MAX_PLRS];
@ -3438,23 +3436,23 @@ void OperateBookCase(int pnum, int i, bool sendmsg)
zhar._mmode = MonsterMode::Talk;
}
}
if (pnum == MyPlayerId)
if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
void OperateDecap(int pnum, int i, bool sendmsg)
void OperateDecap(int i, bool sendmsg, bool sendLootMsg)
{
if (Objects[i]._oSelFlag == 0) {
return;
}
Objects[i]._oSelFlag = 0;
SetRndSeed(Objects[i]._oRndSeed);
CreateRndItem(Objects[i].position, false, sendmsg, false);
if (pnum == MyPlayerId)
CreateRndItem(Objects[i].position, false, sendLootMsg, false);
if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
void OperateArmorStand(int pnum, int i, bool sendmsg)
void OperateArmorStand(int i, bool sendmsg, bool sendLootMsg)
{
if (Objects[i]._oSelFlag == 0) {
return;
@ -3464,15 +3462,15 @@ void OperateArmorStand(int pnum, int i, bool sendmsg)
SetRndSeed(Objects[i]._oRndSeed);
bool uniqueRnd = (GenerateRnd(2) != 0);
if (currlevel <= 5) {
CreateTypeItem(Objects[i].position, true, ItemType::LightArmor, IMISC_NONE, sendmsg, false);
CreateTypeItem(Objects[i].position, true, ItemType::LightArmor, IMISC_NONE, sendLootMsg, false);
} else if (currlevel >= 6 && currlevel <= 9) {
CreateTypeItem(Objects[i].position, uniqueRnd, ItemType::MediumArmor, IMISC_NONE, sendmsg, false);
CreateTypeItem(Objects[i].position, uniqueRnd, ItemType::MediumArmor, IMISC_NONE, sendLootMsg, false);
} else if (currlevel >= 10 && currlevel <= 12) {
CreateTypeItem(Objects[i].position, false, ItemType::HeavyArmor, IMISC_NONE, sendmsg, false);
CreateTypeItem(Objects[i].position, false, ItemType::HeavyArmor, IMISC_NONE, sendLootMsg, false);
} else if (currlevel >= 13) {
CreateTypeItem(Objects[i].position, true, ItemType::HeavyArmor, IMISC_NONE, sendmsg, false);
CreateTypeItem(Objects[i].position, true, ItemType::HeavyArmor, IMISC_NONE, sendLootMsg, false);
}
if (pnum == MyPlayerId)
if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
@ -3610,7 +3608,7 @@ bool OperateFountains(int pnum, int i)
return applied;
}
void OperateWeaponRack(int pnum, int i, bool sendmsg)
void OperateWeaponRack(int i, bool sendmsg, bool sendLootMsg)
{
if (Objects[i]._oSelFlag == 0)
return;
@ -3621,9 +3619,9 @@ void OperateWeaponRack(int pnum, int i, bool sendmsg)
Objects[i]._oSelFlag = 0;
Objects[i]._oAnimFrame++;
CreateTypeItem(Objects[i].position, leveltype != DTYPE_CATHEDRAL, weaponType, IMISC_NONE, sendmsg, false);
CreateTypeItem(Objects[i].position, leveltype != DTYPE_CATHEDRAL, weaponType, IMISC_NONE, sendLootMsg, false);
if (pnum == MyPlayerId)
if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
@ -3660,9 +3658,9 @@ bool OperateNakrulBook(int s)
return false;
}
void OperateStoryBook(int pnum, int i)
void OperateStoryBook(int i)
{
if (Objects[i]._oSelFlag == 0 || qtextflag || pnum != MyPlayerId) {
if (Objects[i]._oSelFlag == 0 || qtextflag) {
return;
}
Objects[i]._oAnimFrame = Objects[i]._oVar4;
@ -3682,13 +3680,13 @@ void OperateStoryBook(int pnum, int i)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
}
void OperateLazStand(int pnum, int i)
void OperateLazStand(int i)
{
if (ActiveItemCount >= MAXITEMS) {
return;
}
if (Objects[i]._oSelFlag == 0 || qtextflag || pnum != MyPlayerId) {
if (Objects[i]._oSelFlag == 0 || qtextflag) {
return;
}
@ -4791,14 +4789,14 @@ void ObjChangeMapResync(int x1, int y1, int x2, int y2)
}
}
void TryDisarm(int pnum, int i)
void TryDisarm(Player &player, int i)
{
if (pnum == MyPlayerId)
if (&player == MyPlayer)
NewCursor(CURSOR_HAND);
if (!Objects[i]._oTrapFlag) {
return;
}
int trapdisper = 2 * Players[pnum]._pDexterity - 5 * currlevel;
int trapdisper = 2 * player._pDexterity - 5 * currlevel;
if (GenerateRnd(100) > trapdisper) {
return;
}
@ -4827,6 +4825,7 @@ int ItemMiscIdIdx(item_misc_id imiscid)
void OperateObject(int pnum, int i, bool teleFlag)
{
bool sendmsg = pnum == MyPlayerId;
Player &player = Players[pnum];
switch (Objects[i]._otype) {
case OBJ_L1LDOOR:
case OBJ_L1RDOOR:
@ -4838,7 +4837,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
}
if (sendmsg)
OperateL1Door(pnum, i);
OperateL1Door(player, i);
break;
case OBJ_L2LDOOR:
case OBJ_L2RDOOR:
@ -4850,7 +4849,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
}
if (sendmsg)
OperateL2Door(pnum, i);
OperateL2Door(player, i);
break;
case OBJ_L3LDOOR:
case OBJ_L3RDOOR:
@ -4862,7 +4861,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
}
if (sendmsg)
OperateL3Door(pnum, i);
OperateL3Door(player, i);
break;
case OBJ_L5LDOOR:
case OBJ_L5RDOOR:
@ -4874,7 +4873,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
}
if (sendmsg)
OperateL5Door(pnum, i);
OperateL5Door(player, i);
break;
case OBJ_LEVER:
case OBJ_L5LEVER:
@ -4897,7 +4896,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
case OBJ_SARC:
case OBJ_L5SARC:
OperateSarc(pnum, i, sendmsg);
OperateSarc(i, sendmsg, sendmsg);
break;
case OBJ_FLAMELVR:
OperateTrapLever(Objects[i]);
@ -4913,18 +4912,18 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
case OBJ_SKELBOOK:
case OBJ_BOOKSTAND:
OperateSkelBook(pnum, i, sendmsg);
OperateSkelBook(i, sendmsg, sendmsg);
break;
case OBJ_BOOKCASEL:
case OBJ_BOOKCASER:
OperateBookCase(pnum, i, sendmsg);
OperateBookCase(i, sendmsg, sendmsg);
break;
case OBJ_DECAP:
OperateDecap(pnum, i, sendmsg);
OperateDecap(i, sendmsg, sendmsg);
break;
case OBJ_ARMORSTAND:
case OBJ_WARARMOR:
OperateArmorStand(pnum, i, sendmsg);
OperateArmorStand(i, sendmsg, sendmsg);
break;
case OBJ_GOATSHRINE:
OperateGoatShrine(pnum, i, LS_GSHRINE);
@ -4940,26 +4939,28 @@ void OperateObject(int pnum, int i, bool teleFlag)
break;
case OBJ_STORYBOOK:
case OBJ_L5BOOKS:
OperateStoryBook(pnum, i);
if (sendmsg)
OperateStoryBook(i);
break;
case OBJ_PEDISTAL:
OperatePedistal(pnum, i);
break;
case OBJ_WARWEAP:
case OBJ_WEAPONRACK:
OperateWeaponRack(pnum, i, sendmsg);
OperateWeaponRack(i, sendmsg, sendmsg);
break;
case OBJ_MUSHPATCH:
OperateMushroomPatch(pnum, Objects[i]);
OperateMushroomPatch(player, Objects[i]);
break;
case OBJ_LAZSTAND:
OperateLazStand(pnum, i);
if (sendmsg)
OperateLazStand(i);
break;
case OBJ_SLAINHERO:
OperateSlainHero(pnum, i);
OperateSlainHero(player, i);
break;
case OBJ_SIGNCHEST:
OperateInnSignChest(pnum, Objects[i]);
OperateInnSignChest(player, Objects[i]);
break;
default:
break;
@ -5048,6 +5049,7 @@ void DeltaSyncOpObject(int cmd, int i)
void SyncOpObject(int pnum, int cmd, int i)
{
bool sendmsg = pnum == MyPlayerId;
switch (Objects[i]._otype) {
case OBJ_L1LDOOR:
case OBJ_L1RDOOR:
@ -5072,7 +5074,7 @@ void SyncOpObject(int pnum, int cmd, int i)
case OBJ_LEVER:
case OBJ_L5LEVER:
case OBJ_SWITCHSKL:
OperateLever(i, pnum == MyPlayerId);
OperateLever(i, sendmsg);
break;
case OBJ_CHEST1:
case OBJ_CHEST2:
@ -5084,12 +5086,12 @@ void SyncOpObject(int pnum, int cmd, int i)
break;
case OBJ_SARC:
case OBJ_L5SARC:
OperateSarc(pnum, i, false);
OperateSarc(i, sendmsg, false);
break;
case OBJ_BLINDBOOK:
case OBJ_BLOODBOOK:
case OBJ_STEELTOME:
OperateBookLever(i, pnum == MyPlayerId);
OperateBookLever(i, sendmsg);
break;
case OBJ_SHRINEL:
case OBJ_SHRINER:
@ -5097,18 +5099,18 @@ void SyncOpObject(int pnum, int cmd, int i)
break;
case OBJ_SKELBOOK:
case OBJ_BOOKSTAND:
OperateSkelBook(pnum, i, false);
OperateSkelBook(i, sendmsg, false);
break;
case OBJ_BOOKCASEL:
case OBJ_BOOKCASER:
OperateBookCase(pnum, i, false);
OperateBookCase(i, sendmsg, false);
break;
case OBJ_DECAP:
OperateDecap(pnum, i, false);
OperateDecap(i, sendmsg, false);
break;
case OBJ_ARMORSTAND:
case OBJ_WARARMOR:
OperateArmorStand(pnum, i, false);
OperateArmorStand(i, sendmsg, false);
break;
case OBJ_GOATSHRINE:
OperateGoatShrine(pnum, i, LS_GSHRINE);
@ -5122,23 +5124,24 @@ void SyncOpObject(int pnum, int cmd, int i)
break;
case OBJ_STORYBOOK:
case OBJ_L5BOOKS:
OperateStoryBook(pnum, i);
if (sendmsg)
OperateStoryBook(i);
break;
case OBJ_PEDISTAL:
OperatePedistal(pnum, i);
break;
case OBJ_WARWEAP:
case OBJ_WEAPONRACK:
OperateWeaponRack(pnum, i, false);
OperateWeaponRack(i, sendmsg, false);
break;
case OBJ_MUSHPATCH:
OperateMushroomPatch(pnum, Objects[i]);
OperateMushroomPatch(Players[pnum], Objects[i]);
break;
case OBJ_SLAINHERO:
OperateSlainHero(pnum, i);
break;
case OBJ_SIGNCHEST:
OperateInnSignChest(pnum, Objects[i]);
OperateInnSignChest(Players[pnum], Objects[i]);
break;
default:
break;

2
Source/objects.h

@ -304,7 +304,7 @@ void RedoPlayerVision();
void MonstCheckDoors(Monster &monster);
void ObjChangeMap(int x1, int y1, int x2, int y2);
void ObjChangeMapResync(int x1, int y1, int x2, int y2);
void TryDisarm(int pnum, int i);
void TryDisarm(Player &player, int i);
int ItemMiscIdIdx(item_misc_id imiscid);
void OperateObject(int pnum, int i, bool TeleFlag);
void SyncOpObject(int pnum, int cmd, int i);

2
Source/player.cpp

@ -1626,7 +1626,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
d = GetDirection(player.position.tile, object->position);
StartAttack(pnum, d);
} else {
TryDisarm(pnum, targetId);
TryDisarm(player, targetId);
OperateObject(pnum, targetId, false);
}
}

Loading…
Cancel
Save