Browse Source

Player by reference

pull/2434/head
Anders Jenbo 5 years ago
parent
commit
9c4e34f988
  1. 8
      Source/controls/plrctrls.cpp
  2. 7
      Source/cursor.cpp
  3. 57
      Source/missiles.cpp
  4. 57
      Source/monster.cpp
  5. 397
      Source/msg.cpp
  6. 51
      Source/multi.cpp
  7. 513
      Source/objects.cpp
  8. 32
      Source/palette.cpp
  9. 19
      Source/pfile.cpp
  10. 5
      Source/plrmsg.cpp
  11. 16
      Source/quests.cpp
  12. 5
      Source/scrollrt.cpp
  13. 45
      Source/spells.cpp
  14. 2
      Source/tmsg.cpp
  15. 7
      Source/town.cpp

8
Source/controls/plrctrls.cpp

@ -1416,11 +1416,11 @@ void UpdateSpellTarget()
pcursplr = -1;
pcursmonst = -1;
int range = 1;
if (Players[MyPlayerId]._pRSpell == SPL_TELEPORT)
range = 4;
auto &myPlayer = Players[MyPlayerId];
int range = myPlayer._pRSpell == SPL_TELEPORT ? 4 : 1;
auto cursm = Players[MyPlayerId].position.future + Displacement::fromDirection(Players[MyPlayerId]._pdir) * range;
auto cursm = myPlayer.position.future + Displacement::fromDirection(myPlayer._pdir) * range;
cursmx = cursm.x;
cursmy = cursm.y;
}

7
Source/cursor.cpp

@ -383,9 +383,10 @@ void CheckCursMove()
if (Objects[pcursobj]._oSelFlag < 1)
pcursobj = -1;
} else if (pcursplr != -1) {
if (Players[pcursplr]._pmode == PM_DEATH || Players[pcursplr]._pmode == PM_QUIT || !Players[pcursplr].plractive
|| currlevel != Players[pcursplr].plrlevel || Players[pcursplr]._pHitPoints >> 6 <= 0
|| ((dFlags[Players[pcursplr].position.tile.x][Players[pcursplr].position.tile.y] & BFLAG_VISIBLE) == 0))
auto &targetPlayer = Players[pcursplr];
if (targetPlayer._pmode == PM_DEATH || targetPlayer._pmode == PM_QUIT || !targetPlayer.plractive
|| currlevel != targetPlayer.plrlevel || targetPlayer._pHitPoints >> 6 <= 0
|| ((dFlags[targetPlayer.position.tile.x][targetPlayer.position.tile.y] & BFLAG_VISIBLE) == 0))
pcursplr = -1;
}

57
Source/missiles.cpp

@ -290,8 +290,9 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
dam = mindam + GenerateRnd(maxdam - mindam + 1);
}
const auto &player = Players[pnum];
if (MissileData[t].mType == 0) {
const auto &player = Players[pnum];
dam = player._pIBonusDamMod + dam * player._pIBonusDam / 100 + dam;
if (player._pClass == HeroClass::Rogue)
dam += player._pDamageMod;
@ -307,7 +308,7 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
if (pnum == MyPlayerId)
monster._mhitpoints -= dam;
if ((gbIsHellfire && (Players[pnum]._pIFlags & ISPL_NOHEALMON) != 0) || (!gbIsHellfire && (Players[pnum]._pIFlags & ISPL_FIRE_ARROWS) != 0))
if ((gbIsHellfire && (player._pIFlags & ISPL_NOHEALMON) != 0) || (!gbIsHellfire && (player._pIFlags & ISPL_FIRE_ARROWS) != 0))
monster._mFlags |= MFLAG_NOHEAL;
if (monster._mhitpoints >> 6 <= 0) {
@ -325,7 +326,7 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
M_StartHit(m, pnum, dam);
monster.Petrify();
} else {
if (MissileData[t].mType == 0 && (Players[pnum]._pIFlags & ISPL_KNOCKBACK) != 0) {
if (MissileData[t].mType == 0 && (player._pIFlags & ISPL_KNOCKBACK) != 0) {
M_GetKnockback(m);
}
if (m > MAX_PLRS - 1)
@ -335,7 +336,7 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
if (monster._msquelch == 0) {
monster._msquelch = UINT8_MAX;
monster.position.last = Players[pnum].position.tile;
monster.position.last = player.position.tile;
}
return true;
@ -1462,7 +1463,8 @@ void AddReflection(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /
if (Missiles[mi]._mispllvl != 0)
lvl = Missiles[mi]._mispllvl;
Players[id].wReflections += lvl * Players[id]._pLevel;
auto &player = Players[id];
player.wReflections += lvl * player._pLevel;
UseMana(id, SPL_REFLECT);
}
@ -1582,7 +1584,7 @@ void AddStealPotions(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t /*m
int8_t pnum = dPlayer[tx][ty];
if (pnum == 0)
continue;
auto &player = Players[pnum > 0 ? pnum - 1 : -(pnum + 1)];
auto &player = Players[abs(pnum) - 1];
bool hasPlayedSFX = false;
for (int si = 0; si < MAXBELTITEMS; si++) {
@ -1655,7 +1657,7 @@ void AddManaTrap(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t /*miene
if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {
int8_t pid = dPlayer[tx][ty];
if (pid != 0) {
auto &player = Players[(pid > 0) ? pid - 1 : -(pid + 1)];
auto &player = Players[abs(pid) - 1];
player._pMana = 0;
player._pManaBase = player._pMana + player._pMaxManaBase - player._pMaxMana;
@ -2352,7 +2354,8 @@ void AddFlash2(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t miene
{
if (mienemy == TARGET_MONSTERS) {
if (id != -1) {
int dmg = GenerateRndSum(20, Players[id]._pLevel + 1) + Players[id]._pLevel + 1;
int dmg = Players[id]._pLevel + 1;
dmg += GenerateRndSum(20, dmg);
Missiles[mi]._midam = ScaleSpellEffect(dmg, Missiles[mi]._mispllvl);
Missiles[mi]._midam += Missiles[mi]._midam / 2;
} else {
@ -2365,12 +2368,13 @@ void AddFlash2(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t miene
void AddManashield(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t mienemy, int id, int /*dam*/)
{
Missiles[mi]._mirange = 48 * Players[id]._pLevel;
auto &player = Players[id];
Missiles[mi]._mirange = 48 * player._pLevel;
if (mienemy == TARGET_MONSTERS)
UseMana(id, SPL_MANASHIELD);
if (id == MyPlayerId)
NetSendCmd(true, CMD_SETSHIELD);
Players[id].pManaShield = true;
player.pManaShield = true;
}
void AddFiremove(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/)
@ -2387,7 +2391,9 @@ void AddFiremove(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/
void AddGuardian(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/)
{
int dmg = GenerateRnd(10) + (Players[id]._pLevel / 2) + 1;
auto &player = Players[id];
int dmg = GenerateRnd(10) + (player._pLevel / 2) + 1;
Missiles[mi]._midam = ScaleSpellEffect(dmg, Missiles[mi]._mispllvl);
Missiles[mi]._miDelFlag = true;
@ -2416,8 +2422,8 @@ void AddGuardian(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/
if (!Missiles[mi]._miDelFlag) {
Missiles[mi]._misource = id;
Missiles[mi]._mlid = AddLight(Missiles[mi].position.tile, 1);
Missiles[mi]._mirange = Missiles[mi]._mispllvl + (Players[id]._pLevel / 2);
Missiles[mi]._mirange += (Missiles[mi]._mirange * Players[id]._pISplDur) / 128;
Missiles[mi]._mirange = Missiles[mi]._mispllvl + (player._pLevel / 2);
Missiles[mi]._mirange += (Missiles[mi]._mirange * player._pISplDur) / 128;
if (Missiles[mi]._mirange > 30)
Missiles[mi]._mirange = 30;
@ -2937,7 +2943,8 @@ void AddApoca(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t /*mienemy*
Missiles[mi]._miVar4 = 1;
if (Missiles[mi]._miVar5 >= MAXDUNX)
Missiles[mi]._miVar5 = MAXDUNX - 1;
Missiles[mi]._midam = GenerateRndSum(6, Players[id]._pLevel) + Players[id]._pLevel;
int playerLevel = Players[id]._pLevel;
Missiles[mi]._midam = GenerateRndSum(6, playerLevel) + playerLevel;
Missiles[mi]._mirange = 255;
Missiles[mi]._miDelFlag = false;
UseMana(id, SPL_APOCA);
@ -3094,8 +3101,10 @@ int AddMissile(Point src, Point dst, int midir, int mitype, int8_t micaster, int
if (ActiveMissileCount >= MAXMISSILES - 1)
return -1;
if (mitype == MIS_MANASHIELD && Players[id].pManaShield) {
if (currlevel != Players[id].plrlevel)
auto &player = Players[id];
if (mitype == MIS_MANASHIELD && player.pManaShield) {
if (currlevel != player.plrlevel)
return -1;
for (int i = 0; i < ActiveMissileCount; i++) {
@ -3311,12 +3320,13 @@ void MI_Firebolt(int i)
int p = Missiles[i]._misource;
if (p != -1) {
if (Missiles[i]._micaster == TARGET_MONSTERS) {
auto &player = Players[p];
switch (Missiles[i]._mitype) {
case MIS_FIREBOLT:
d = GenerateRnd(10) + (Players[p]._pMagic / 8) + Missiles[i]._mispllvl + 1;
d = GenerateRnd(10) + (player._pMagic / 8) + Missiles[i]._mispllvl + 1;
break;
case MIS_FLARE:
d = 3 * Missiles[i]._mispllvl - (Players[p]._pMagic / 8) + (Players[p]._pMagic / 2);
d = 3 * Missiles[i]._mispllvl - (player._pMagic / 8) + (player._pMagic / 2);
break;
case MIS_BONESPIRIT:
d = 0;
@ -3654,9 +3664,11 @@ void MI_LightningArrow(int i)
void MI_Reflect(int i)
{
int src = Missiles[i]._misource;
if (src != MyPlayerId && currlevel != Players[src].plrlevel)
auto &player = Players[src];
if (src != MyPlayerId && currlevel != player.plrlevel)
Missiles[i]._miDelFlag = true;
if (Players[src].wReflections <= 0) {
if (player.wReflections <= 0) {
Missiles[i]._miDelFlag = true;
NetSendCmd(true, CMD_REFLECT);
}
@ -3759,10 +3771,11 @@ void MI_SpecArrow(int i)
Direction dir = DIR_S;
mienemy_type micaster = TARGET_PLAYERS;
if (id != -1) {
dir = Players[id]._pdir;
auto &player = Players[id];
dir = player._pdir;
micaster = TARGET_MONSTERS;
switch (Players[id]._pILMinDam) {
switch (player._pILMinDam) {
case 0:
mitype = MIS_FIRENOVA;
break;

57
Source/monster.cpp

@ -3364,7 +3364,8 @@ void LazarusAi(int i)
Direction md = GetMonsterDirection(monster);
if ((dFlags[mx][my] & BFLAG_VISIBLE) != 0) {
if (!gbIsMultiplayer) {
if (monster.mtalkmsg == TEXT_VILE13 && monster._mgoal == MGOAL_INQUIRING && Players[MyPlayerId].position.tile.x == 35 && Players[MyPlayerId].position.tile.y == 46) {
auto &myPlayer = Players[MyPlayerId];
if (monster.mtalkmsg == TEXT_VILE13 && monster._mgoal == MGOAL_INQUIRING && myPlayer.position.tile.x == 35 && myPlayer.position.tile.y == 46) {
PlayInGameMovie("gendata\\fprst3.smk");
monster._mmode = MM_TALK;
Quests[Q_BETRAYER]._qvar1 = 5;
@ -4273,7 +4274,9 @@ void PrepDoEnding()
MyPlayerIsDead = false;
cineflag = true;
Players[MyPlayerId].pDiabloKillLevel = std::max(Players[MyPlayerId].pDiabloKillLevel, static_cast<uint8_t>(sgGameInitInfo.nDifficulty + 1));
auto &myPlayer = Players[MyPlayerId];
myPlayer.pDiabloKillLevel = std::max(myPlayer.pDiabloKillLevel, static_cast<uint8_t>(sgGameInitInfo.nDifficulty + 1));
for (auto &player : Players) {
player._pmode = PM_QUIT;
@ -4458,10 +4461,11 @@ void ProcessMonsters()
monster.enemyPosition = monster.position.last;
} else {
assert(monster._menemy >= 0 && monster._menemy < MAX_PLRS);
monster.enemyPosition = Players[monster._menemy].position.future;
auto &player = Players[monster._menemy];
monster.enemyPosition = player.position.future;
if ((dFlags[mx][my] & BFLAG_VISIBLE) != 0) {
monster._msquelch = UINT8_MAX;
monster.position.last = Players[monster._menemy].position.future;
monster.position.last = player.position.future;
} else if (monster._msquelch != 0 && monster.MType->mtype != MT_DIABLO) { /// BUGFIX: change '_mAi' to 'MType->mtype'
monster._msquelch--;
}
@ -5056,21 +5060,21 @@ int PreSpawnSkeleton()
void TalktoMonster(MonsterStruct &monster)
{
int pnum = monster._menemy;
auto &player = Players[monster._menemy];
monster._mmode = MM_TALK;
if (monster._mAi != AI_SNOTSPIL && monster._mAi != AI_LACHDAN) {
return;
}
if (QuestStatus(Q_LTBANNER) && Quests[Q_LTBANNER]._qvar1 == 2) {
if (Players[pnum].TryRemoveInvItemById(IDI_BANNER)) {
if (player.TryRemoveInvItemById(IDI_BANNER)) {
Quests[Q_LTBANNER]._qactive = QUEST_DONE;
monster.mtalkmsg = TEXT_BANNER12;
monster._mgoal = MGOAL_INQUIRING;
}
}
if (QuestStatus(Q_VEIL) && monster.mtalkmsg >= TEXT_VEIL9) {
if (Players[pnum].TryRemoveInvItemById(IDI_GLDNELIX)) {
if (player.TryRemoveInvItemById(IDI_GLDNELIX)) {
monster.mtalkmsg = TEXT_VEIL11;
monster._mgoal = MGOAL_INQUIRING;
}
@ -5080,29 +5084,30 @@ void TalktoMonster(MonsterStruct &monster)
void SpawnGolum(int i, Point position, int mi)
{
assert(i >= 0 && i < MAXMONSTERS);
auto &monster = Monsters[i];
auto &player = Players[i];
auto &golem = Monsters[i];
dMonster[position.x][position.y] = i + 1;
monster.position.tile = position;
monster.position.future = position;
monster.position.old = position;
monster._pathcount = 0;
monster._mmaxhp = 2 * (320 * Missiles[mi]._mispllvl + Players[i]._pMaxMana / 3);
monster._mhitpoints = monster._mmaxhp;
monster.mArmorClass = 25;
monster.mHit = 5 * (Missiles[mi]._mispllvl + 8) + 2 * Players[i]._pLevel;
monster.mMinDamage = 2 * (Missiles[mi]._mispllvl + 4);
monster.mMaxDamage = 2 * (Missiles[mi]._mispllvl + 8);
monster._mFlags |= MFLAG_GOLEM;
StartSpecialStand(monster, DIR_S);
UpdateEnemy(monster);
golem.position.tile = position;
golem.position.future = position;
golem.position.old = position;
golem._pathcount = 0;
golem._mmaxhp = 2 * (320 * Missiles[mi]._mispllvl + player._pMaxMana / 3);
golem._mhitpoints = golem._mmaxhp;
golem.mArmorClass = 25;
golem.mHit = 5 * (Missiles[mi]._mispllvl + 8) + 2 * player._pLevel;
golem.mMinDamage = 2 * (Missiles[mi]._mispllvl + 4);
golem.mMaxDamage = 2 * (Missiles[mi]._mispllvl + 8);
golem._mFlags |= MFLAG_GOLEM;
StartSpecialStand(golem, DIR_S);
UpdateEnemy(golem);
if (i == MyPlayerId) {
NetSendCmdGolem(
monster.position.tile.x,
monster.position.tile.y,
monster._mdir,
monster._menemy,
monster._mhitpoints,
golem.position.tile.x,
golem.position.tile.y,
golem._mdir,
golem._menemy,
golem._mhitpoints,
currlevel);
}
}

397
Source/msg.cpp

@ -683,11 +683,11 @@ DWORD OnGotoGetItem(TCmd *pCmd, PlayerStruct &player)
return sizeof(*p);
}
DWORD OnRequestGetItem(TCmd *pCmd, int pnum)
DWORD OnRequestGetItem(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdGItem *)pCmd;
if (gbBufferMsgs != 1 && IOwnLevel(Players[pnum].plrlevel)) {
if (gbBufferMsgs != 1 && IOwnLevel(player.plrlevel)) {
if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {
int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
if (ii != -1) {
@ -718,7 +718,8 @@ DWORD OnGetItem(TCmd *pCmd, int pnum)
if ((currlevel == p->bLevel || p->bPnum == MyPlayerId) && p->bMaster != MyPlayerId) {
if (p->bPnum == MyPlayerId) {
if (currlevel != p->bLevel) {
ii = SyncPutItem(Players[MyPlayerId], Players[MyPlayerId].position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
auto &player = Players[MyPlayerId];
ii = SyncPutItem(player, player.position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
if (ii != -1)
InvGetItem(MyPlayerId, &Items[ii], ii);
} else {
@ -749,11 +750,11 @@ DWORD OnGotoAutoGetItem(TCmd *pCmd, PlayerStruct &player)
return sizeof(*p);
}
DWORD OnRequestAutoGetItem(TCmd *pCmd, int pnum)
DWORD OnRequestAutoGetItem(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdGItem *)pCmd;
if (gbBufferMsgs != 1 && IOwnLevel(Players[pnum].plrlevel)) {
if (gbBufferMsgs != 1 && IOwnLevel(player.plrlevel)) {
if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {
int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
if (ii != -1) {
@ -784,7 +785,8 @@ DWORD OnAutoGetItem(TCmd *pCmd, int pnum)
if ((currlevel == p->bLevel || p->bPnum == MyPlayerId) && p->bMaster != MyPlayerId) {
if (p->bPnum == MyPlayerId) {
if (currlevel != p->bLevel) {
int ii = SyncPutItem(Players[MyPlayerId], Players[MyPlayerId].position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
auto &player = Players[MyPlayerId];
int ii = SyncPutItem(player, player.position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
if (ii != -1)
AutoGetItem(MyPlayerId, &Items[ii], ii);
} else {
@ -874,11 +876,13 @@ DWORD OnRespawnItem(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, p, sizeof(*p));
} else {
if (currlevel == Players[pnum].plrlevel && pnum != MyPlayerId) {
SyncPutItem(Players[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
auto &player = Players[pnum];
int playerLevel = player.plrlevel;
if (currlevel == playerLevel && pnum != MyPlayerId) {
SyncPutItem(player, { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
}
PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
DeltaPutItem(p, p->x, p->y, Players[pnum].plrlevel);
DeltaPutItem(p, p->x, p->y, playerLevel);
}
return sizeof(*p);
@ -898,98 +902,98 @@ DWORD OnAttackTile(TCmd *pCmd, PlayerStruct &player)
return sizeof(*p);
}
DWORD OnStandingAttackTile(TCmd *pCmd, int pnum)
DWORD OnStandingAttackTile(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdLoc *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_ATTACK;
Players[pnum].destParam1 = p->x;
Players[pnum].destParam2 = p->y;
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
ClrPlrPath(player);
player.destAction = ACTION_ATTACK;
player.destParam1 = p->x;
player.destParam2 = p->y;
}
return sizeof(*p);
}
DWORD OnRangedAttackTile(TCmd *pCmd, int pnum)
DWORD OnRangedAttackTile(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdLoc *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_RATTACK;
Players[pnum].destParam1 = p->x;
Players[pnum].destParam2 = p->y;
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
ClrPlrPath(player);
player.destAction = ACTION_RATTACK;
player.destParam1 = p->x;
player.destParam2 = p->y;
}
return sizeof(*p);
}
DWORD OnSpellWall(TCmd *pCmd, int pnum)
DWORD OnSpellWall(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdLocParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
auto spell = static_cast<spell_id>(p->wParam1);
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_SPELLWALL;
Players[pnum].destParam1 = p->x;
Players[pnum].destParam2 = p->y;
Players[pnum].destParam3 = static_cast<Direction>(p->wParam2);
Players[pnum].destParam4 = p->wParam3;
Players[pnum]._pSpell = spell;
Players[pnum]._pSplType = Players[pnum]._pRSplType;
Players[pnum]._pSplFrom = 0;
ClrPlrPath(player);
player.destAction = ACTION_SPELLWALL;
player.destParam1 = p->x;
player.destParam2 = p->y;
player.destParam3 = static_cast<Direction>(p->wParam2);
player.destParam4 = p->wParam3;
player._pSpell = spell;
player._pSplType = player._pRSplType;
player._pSplFrom = 0;
} else {
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), Players[pnum]._pName).c_str());
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), player._pName).c_str());
}
}
return sizeof(*p);
}
DWORD OnSpellTile(TCmd *pCmd, int pnum)
DWORD OnSpellTile(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdLocParam2 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
auto spell = static_cast<spell_id>(p->wParam1);
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_SPELL;
Players[pnum].destParam1 = p->x;
Players[pnum].destParam2 = p->y;
Players[pnum].destParam3 = static_cast<Direction>(p->wParam2);
Players[pnum]._pSpell = spell;
Players[pnum]._pSplType = Players[pnum]._pRSplType;
Players[pnum]._pSplFrom = 0;
ClrPlrPath(player);
player.destAction = ACTION_SPELL;
player.destParam1 = p->x;
player.destParam2 = p->y;
player.destParam3 = static_cast<Direction>(p->wParam2);
player._pSpell = spell;
player._pSplType = player._pRSplType;
player._pSplFrom = 0;
} else {
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), Players[pnum]._pName).c_str());
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), player._pName).c_str());
}
}
return sizeof(*p);
}
DWORD OnTargetSpellTile(TCmd *pCmd, int pnum)
DWORD OnTargetSpellTile(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdLocParam2 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
auto spell = static_cast<spell_id>(p->wParam1);
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_SPELL;
Players[pnum].destParam1 = p->x;
Players[pnum].destParam2 = p->y;
Players[pnum].destParam3 = static_cast<Direction>(p->wParam2);
Players[pnum]._pSpell = spell;
Players[pnum]._pSplType = RSPLTYPE_INVALID;
Players[pnum]._pSplFrom = 2;
ClrPlrPath(player);
player.destAction = ACTION_SPELL;
player.destParam1 = p->x;
player.destParam2 = p->y;
player.destParam3 = static_cast<Direction>(p->wParam2);
player._pSpell = spell;
player._pSplType = RSPLTYPE_INVALID;
player._pSplFrom = 2;
} else {
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), Players[pnum]._pName).c_str());
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), player._pName).c_str());
}
}
@ -1022,13 +1026,13 @@ DWORD OnDisarm(TCmd *pCmd, PlayerStruct &player)
return sizeof(*p);
}
DWORD OnOperateObjectTelekinesis(TCmd *pCmd, int pnum)
DWORD OnOperateObjectTelekinesis(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdParam1 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
Players[pnum].destAction = ACTION_OPERATETK;
Players[pnum].destParam1 = p->wParam1;
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
player.destAction = ACTION_OPERATETK;
player.destParam1 = p->wParam1;
}
return sizeof(*p);
@ -1062,114 +1066,114 @@ DWORD OnAttackPlayer(TCmd *pCmd, PlayerStruct &player)
return sizeof(*p);
}
DWORD OnRangedAttackMonster(TCmd *pCmd, int pnum)
DWORD OnRangedAttackMonster(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdParam1 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_RATTACKMON;
Players[pnum].destParam1 = p->wParam1;
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
ClrPlrPath(player);
player.destAction = ACTION_RATTACKMON;
player.destParam1 = p->wParam1;
}
return sizeof(*p);
}
DWORD OnRangedAttackPlayer(TCmd *pCmd, int pnum)
DWORD OnRangedAttackPlayer(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdParam1 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_RATTACKPLR;
Players[pnum].destParam1 = p->wParam1;
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
ClrPlrPath(player);
player.destAction = ACTION_RATTACKPLR;
player.destParam1 = p->wParam1;
}
return sizeof(*p);
}
DWORD OnSpellMonster(TCmd *pCmd, int pnum)
DWORD OnSpellMonster(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
auto spell = static_cast<spell_id>(p->wParam2);
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_SPELLMON;
Players[pnum].destParam1 = p->wParam1;
Players[pnum].destParam2 = p->wParam3;
Players[pnum]._pSpell = spell;
Players[pnum]._pSplType = Players[pnum]._pRSplType;
Players[pnum]._pSplFrom = 0;
ClrPlrPath(player);
player.destAction = ACTION_SPELLMON;
player.destParam1 = p->wParam1;
player.destParam2 = p->wParam3;
player._pSpell = spell;
player._pSplType = player._pRSplType;
player._pSplFrom = 0;
} else {
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), Players[pnum]._pName).c_str());
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), player._pName).c_str());
}
}
return sizeof(*p);
}
DWORD OnSpellPlayer(TCmd *pCmd, int pnum)
DWORD OnSpellPlayer(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
auto spell = static_cast<spell_id>(p->wParam2);
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_SPELLPLR;
Players[pnum].destParam1 = p->wParam1;
Players[pnum].destParam2 = p->wParam3;
Players[pnum]._pSpell = spell;
Players[pnum]._pSplType = Players[pnum]._pRSplType;
Players[pnum]._pSplFrom = 0;
ClrPlrPath(player);
player.destAction = ACTION_SPELLPLR;
player.destParam1 = p->wParam1;
player.destParam2 = p->wParam3;
player._pSpell = spell;
player._pSplType = player._pRSplType;
player._pSplFrom = 0;
} else {
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), Players[pnum]._pName).c_str());
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), player._pName).c_str());
}
}
return sizeof(*p);
}
DWORD OnTargetSpellMonster(TCmd *pCmd, int pnum)
DWORD OnTargetSpellMonster(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
auto spell = static_cast<spell_id>(p->wParam2);
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_SPELLMON;
Players[pnum].destParam1 = p->wParam1;
Players[pnum].destParam2 = p->wParam3;
Players[pnum]._pSpell = spell;
Players[pnum]._pSplType = RSPLTYPE_INVALID;
Players[pnum]._pSplFrom = 2;
ClrPlrPath(player);
player.destAction = ACTION_SPELLMON;
player.destParam1 = p->wParam1;
player.destParam2 = p->wParam3;
player._pSpell = spell;
player._pSplType = RSPLTYPE_INVALID;
player._pSplFrom = 2;
} else {
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), Players[pnum]._pName).c_str());
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), player._pName).c_str());
}
}
return sizeof(*p);
}
DWORD OnTargetSpellPlayer(TCmd *pCmd, int pnum)
DWORD OnTargetSpellPlayer(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel) {
if (gbBufferMsgs != 1 && currlevel == player.plrlevel) {
auto spell = static_cast<spell_id>(p->wParam2);
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(Players[pnum]);
Players[pnum].destAction = ACTION_SPELLPLR;
Players[pnum].destParam1 = p->wParam1;
Players[pnum].destParam2 = p->wParam3;
Players[pnum]._pSpell = spell;
Players[pnum]._pSplType = RSPLTYPE_INVALID;
Players[pnum]._pSplFrom = 2;
ClrPlrPath(player);
player.destAction = ACTION_SPELLPLR;
player.destParam1 = p->wParam1;
player.destParam2 = p->wParam3;
player._pSpell = spell;
player._pSplType = RSPLTYPE_INVALID;
player._pSplFrom = 2;
} else {
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), Players[pnum]._pName).c_str());
PlayerMessageFormat(fmt::format(_("{:s} has cast an illegal spell."), player._pName).c_str());
}
}
@ -1257,9 +1261,10 @@ DWORD OnMonstDeath(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1)
SendPacket(pnum, p, sizeof(*p));
else if (pnum != MyPlayerId && p->wParam1 < MAXMONSTERS) {
if (currlevel == Players[pnum].plrlevel)
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
M_SyncStartKill(p->wParam1, { p->x, p->y }, pnum);
delta_kill_monster(p->wParam1, { p->x, p->y }, Players[pnum].plrlevel);
delta_kill_monster(p->wParam1, { p->x, p->y }, playerLevel);
}
return sizeof(*p);
@ -1312,14 +1317,15 @@ DWORD OnMonstDamage(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1)
SendPacket(pnum, p, sizeof(*p)); // BUGFIX: change to sizeof(*p) or it still uses TCmdParam2 size for hellfire (fixed)
else if (pnum != MyPlayerId) {
if (currlevel == Players[pnum].plrlevel) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel) {
auto &monster = Monsters[p->wMon];
monster.mWhoHit |= 1 << pnum;
if (monster._mhitpoints > 0) {
monster._mhitpoints -= p->dwDam;
if ((monster._mhitpoints >> 6) < 1)
monster._mhitpoints = 1 << 6;
delta_monster_hp(p->wMon, monster._mhitpoints, Players[pnum].plrlevel);
delta_monster_hp(p->wMon, monster._mhitpoints, playerLevel);
}
}
}
@ -1341,12 +1347,12 @@ DWORD OnPlayerDeath(TCmd *pCmd, int pnum)
return sizeof(*p);
}
DWORD OnPlayerDamage(TCmd *pCmd, int pnum)
DWORD OnPlayerDamage(TCmd *pCmd, PlayerStruct &player)
{
auto *p = (TCmdDamage *)pCmd;
if (p->bPlr == MyPlayerId && currlevel != 0 && gbBufferMsgs != 1) {
if (currlevel == Players[pnum].plrlevel && p->dwDam <= 192000 && Players[MyPlayerId]._pHitPoints >> 6 > 0) {
if (currlevel == player.plrlevel && p->dwDam <= 192000 && Players[MyPlayerId]._pHitPoints >> 6 > 0) {
ApplyPlrDamage(MyPlayerId, 0, 0, p->dwDam, 1);
}
}
@ -1361,9 +1367,10 @@ DWORD OnOpenDoor(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, p, sizeof(*p));
} else {
if (currlevel == Players[pnum].plrlevel)
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
SyncOpObject(pnum, CMD_OPENDOOR, p->wParam1);
DeltaSyncObject(p->wParam1, CMD_OPENDOOR, Players[pnum].plrlevel);
DeltaSyncObject(p->wParam1, CMD_OPENDOOR, playerLevel);
}
return sizeof(*p);
@ -1376,9 +1383,10 @@ DWORD OnCloseDoor(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, p, sizeof(*p));
} else {
if (currlevel == Players[pnum].plrlevel)
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
SyncOpObject(pnum, CMD_CLOSEDOOR, p->wParam1);
DeltaSyncObject(p->wParam1, CMD_CLOSEDOOR, Players[pnum].plrlevel);
DeltaSyncObject(p->wParam1, CMD_CLOSEDOOR, playerLevel);
}
return sizeof(*p);
@ -1391,9 +1399,10 @@ DWORD OnOperateObject(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, p, sizeof(*p));
} else {
if (currlevel == Players[pnum].plrlevel)
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
SyncOpObject(pnum, CMD_OPERATEOBJ, p->wParam1);
DeltaSyncObject(p->wParam1, CMD_OPERATEOBJ, Players[pnum].plrlevel);
DeltaSyncObject(p->wParam1, CMD_OPERATEOBJ, playerLevel);
}
return sizeof(*p);
@ -1406,9 +1415,10 @@ DWORD OnPlayerOperateObject(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, p, sizeof(*p));
} else {
if (currlevel == Players[pnum].plrlevel)
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
SyncOpObject(p->wParam1, CMD_PLROPOBJ, p->wParam2);
DeltaSyncObject(p->wParam2, CMD_PLROPOBJ, Players[pnum].plrlevel);
DeltaSyncObject(p->wParam2, CMD_PLROPOBJ, playerLevel);
}
return sizeof(*p);
@ -1421,9 +1431,10 @@ DWORD OnBreakObject(TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, p, sizeof(*p));
} else {
if (currlevel == Players[pnum].plrlevel)
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
SyncBreakObj(p->wParam1, p->wParam2);
DeltaSyncObject(p->wParam2, CMD_BREAKOBJ, Players[pnum].plrlevel);
DeltaSyncObject(p->wParam2, CMD_BREAKOBJ, playerLevel);
}
return sizeof(*p);
@ -1701,10 +1712,12 @@ DWORD OnCheatExperience(TCmd *pCmd, int pnum) // NOLINT(misc-unused-parameters)
DWORD OnCheatSpellLevel(TCmd *pCmd, int pnum) // NOLINT(misc-unused-parameters)
{
#ifdef _DEBUG
if (gbBufferMsgs == 1)
if (gbBufferMsgs == 1) {
SendPacket(pnum, pCmd, sizeof(*pCmd));
else
Players[pnum]._pSplLvl[Players[pnum]._pRSpell]++;
} else {
auto &player = Players[pnum];
player._pSplLvl[player._pRSpell]++;
}
#endif
return sizeof(*pCmd);
}
@ -1718,31 +1731,34 @@ DWORD OnNova(TCmd *pCmd, int pnum)
{
auto *p = (TCmdLoc *)pCmd;
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel && pnum != MyPlayerId) {
ClrPlrPath(Players[pnum]);
Players[pnum]._pSpell = SPL_NOVA;
Players[pnum]._pSplType = RSPLTYPE_INVALID;
Players[pnum]._pSplFrom = 3;
Players[pnum].destAction = ACTION_SPELL;
Players[pnum].destParam1 = p->x;
Players[pnum].destParam2 = p->y;
if (gbBufferMsgs != 1) {
auto &player = Players[pnum];
if (currlevel == player.plrlevel && pnum != MyPlayerId) {
ClrPlrPath(player);
player._pSpell = SPL_NOVA;
player._pSplType = RSPLTYPE_INVALID;
player._pSplFrom = 3;
player.destAction = ACTION_SPELL;
player.destParam1 = p->x;
player.destParam2 = p->y;
}
}
return sizeof(*p);
}
DWORD OnSetShield(TCmd *pCmd, int pnum)
DWORD OnSetShield(TCmd *pCmd, PlayerStruct &player)
{
if (gbBufferMsgs != 1)
Players[pnum].pManaShield = true;
player.pManaShield = true;
return sizeof(*pCmd);
}
DWORD OnRemoveShield(TCmd *pCmd, int pnum)
DWORD OnRemoveShield(TCmd *pCmd, PlayerStruct &player)
{
if (gbBufferMsgs != 1)
Players[pnum].pManaShield = false;
player.pManaShield = false;
return sizeof(*pCmd);
}
@ -2342,34 +2358,35 @@ void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position)
cmd.bCmd = bCmd;
cmd.x = position.x;
cmd.y = position.y;
cmd.wIndx = Players[MyPlayerId].HoldItem.IDidx;
if (Players[MyPlayerId].HoldItem.IDidx == IDI_EAR) {
cmd.wCI = Players[MyPlayerId].HoldItem._iName[8] | (Players[MyPlayerId].HoldItem._iName[7] << 8);
cmd.dwSeed = Players[MyPlayerId].HoldItem._iName[12] | ((Players[MyPlayerId].HoldItem._iName[11] | ((Players[MyPlayerId].HoldItem._iName[10] | (Players[MyPlayerId].HoldItem._iName[9] << 8)) << 8)) << 8);
cmd.bId = Players[MyPlayerId].HoldItem._iName[13];
cmd.bDur = Players[MyPlayerId].HoldItem._iName[14];
cmd.bMDur = Players[MyPlayerId].HoldItem._iName[15];
cmd.bCh = Players[MyPlayerId].HoldItem._iName[16];
cmd.bMCh = Players[MyPlayerId].HoldItem._iName[17];
cmd.wValue = Players[MyPlayerId].HoldItem._ivalue | (Players[MyPlayerId].HoldItem._iName[18] << 8) | ((Players[MyPlayerId].HoldItem._iCurs - ICURS_EAR_SORCERER) << 6);
cmd.dwBuff = Players[MyPlayerId].HoldItem._iName[22] | ((Players[MyPlayerId].HoldItem._iName[21] | ((Players[MyPlayerId].HoldItem._iName[20] | (Players[MyPlayerId].HoldItem._iName[19] << 8)) << 8)) << 8);
auto &myPlayer = Players[MyPlayerId];
cmd.wIndx = myPlayer.HoldItem.IDidx;
if (myPlayer.HoldItem.IDidx == IDI_EAR) {
cmd.wCI = myPlayer.HoldItem._iName[8] | (myPlayer.HoldItem._iName[7] << 8);
cmd.dwSeed = myPlayer.HoldItem._iName[12] | ((myPlayer.HoldItem._iName[11] | ((myPlayer.HoldItem._iName[10] | (myPlayer.HoldItem._iName[9] << 8)) << 8)) << 8);
cmd.bId = myPlayer.HoldItem._iName[13];
cmd.bDur = myPlayer.HoldItem._iName[14];
cmd.bMDur = myPlayer.HoldItem._iName[15];
cmd.bCh = myPlayer.HoldItem._iName[16];
cmd.bMCh = myPlayer.HoldItem._iName[17];
cmd.wValue = myPlayer.HoldItem._ivalue | (myPlayer.HoldItem._iName[18] << 8) | ((myPlayer.HoldItem._iCurs - ICURS_EAR_SORCERER) << 6);
cmd.dwBuff = myPlayer.HoldItem._iName[22] | ((myPlayer.HoldItem._iName[21] | ((myPlayer.HoldItem._iName[20] | (myPlayer.HoldItem._iName[19] << 8)) << 8)) << 8);
} else {
cmd.wCI = Players[MyPlayerId].HoldItem._iCreateInfo;
cmd.dwSeed = Players[MyPlayerId].HoldItem._iSeed;
cmd.bId = Players[MyPlayerId].HoldItem._iIdentified ? 1 : 0;
cmd.bDur = Players[MyPlayerId].HoldItem._iDurability;
cmd.bMDur = Players[MyPlayerId].HoldItem._iMaxDur;
cmd.bCh = Players[MyPlayerId].HoldItem._iCharges;
cmd.bMCh = Players[MyPlayerId].HoldItem._iMaxCharges;
cmd.wValue = Players[MyPlayerId].HoldItem._ivalue;
cmd.wToHit = Players[MyPlayerId].HoldItem._iPLToHit;
cmd.wMaxDam = Players[MyPlayerId].HoldItem._iMaxDam;
cmd.bMinStr = Players[MyPlayerId].HoldItem._iMinStr;
cmd.bMinMag = Players[MyPlayerId].HoldItem._iMinMag;
cmd.bMinDex = Players[MyPlayerId].HoldItem._iMinDex;
cmd.bAC = Players[MyPlayerId].HoldItem._iAC;
cmd.dwBuff = Players[MyPlayerId].HoldItem.dwBuff;
cmd.wCI = myPlayer.HoldItem._iCreateInfo;
cmd.dwSeed = myPlayer.HoldItem._iSeed;
cmd.bId = myPlayer.HoldItem._iIdentified ? 1 : 0;
cmd.bDur = myPlayer.HoldItem._iDurability;
cmd.bMDur = myPlayer.HoldItem._iMaxDur;
cmd.bCh = myPlayer.HoldItem._iCharges;
cmd.bMCh = myPlayer.HoldItem._iMaxCharges;
cmd.wValue = myPlayer.HoldItem._ivalue;
cmd.wToHit = myPlayer.HoldItem._iPLToHit;
cmd.wMaxDam = myPlayer.HoldItem._iMaxDam;
cmd.bMinStr = myPlayer.HoldItem._iMinStr;
cmd.bMinMag = myPlayer.HoldItem._iMinMag;
cmd.bMinDex = myPlayer.HoldItem._iMinDex;
cmd.bAC = myPlayer.HoldItem._iAC;
cmd.dwBuff = myPlayer.HoldItem.dwBuff;
}
if (bHiPri)
@ -2382,13 +2399,15 @@ void NetSendCmdChItem(bool bHiPri, BYTE bLoc)
{
TCmdChItem cmd;
auto &myPlayer = Players[MyPlayerId];
cmd.bCmd = CMD_CHANGEPLRITEMS;
cmd.bLoc = bLoc;
cmd.wIndx = Players[MyPlayerId].HoldItem.IDidx;
cmd.wCI = Players[MyPlayerId].HoldItem._iCreateInfo;
cmd.dwSeed = Players[MyPlayerId].HoldItem._iSeed;
cmd.bId = Players[MyPlayerId].HoldItem._iIdentified ? 1 : 0;
cmd.dwBuff = Players[MyPlayerId].HoldItem.dwBuff;
cmd.wIndx = myPlayer.HoldItem.IDidx;
cmd.wCI = myPlayer.HoldItem._iCreateInfo;
cmd.dwSeed = myPlayer.HoldItem._iSeed;
cmd.bId = myPlayer.HoldItem._iIdentified ? 1 : 0;
cmd.dwBuff = myPlayer.HoldItem.dwBuff;
if (bHiPri)
NetSendHiPri(MyPlayerId, (byte *)&cmd, sizeof(cmd));
@ -2518,13 +2537,13 @@ DWORD ParseCmd(int pnum, TCmd *pCmd)
case CMD_GOTOGETITEM:
return OnGotoGetItem(pCmd, player);
case CMD_REQUESTGITEM:
return OnRequestGetItem(pCmd, pnum);
return OnRequestGetItem(pCmd, player);
case CMD_GETITEM:
return OnGetItem(pCmd, pnum);
case CMD_GOTOAGETITEM:
return OnGotoAutoGetItem(pCmd, player);
case CMD_REQUESTAGITEM:
return OnRequestAutoGetItem(pCmd, pnum);
return OnRequestAutoGetItem(pCmd, player);
case CMD_AGETITEM:
return OnAutoGetItem(pCmd, pnum);
case CMD_ITEMEXTRA:
@ -2538,37 +2557,37 @@ DWORD ParseCmd(int pnum, TCmd *pCmd)
case CMD_ATTACKXY:
return OnAttackTile(pCmd, player);
case CMD_SATTACKXY:
return OnStandingAttackTile(pCmd, pnum);
return OnStandingAttackTile(pCmd, player);
case CMD_RATTACKXY:
return OnRangedAttackTile(pCmd, pnum);
return OnRangedAttackTile(pCmd, player);
case CMD_SPELLXYD:
return OnSpellWall(pCmd, pnum);
return OnSpellWall(pCmd, player);
case CMD_SPELLXY:
return OnSpellTile(pCmd, pnum);
return OnSpellTile(pCmd, player);
case CMD_TSPELLXY:
return OnTargetSpellTile(pCmd, pnum);
return OnTargetSpellTile(pCmd, player);
case CMD_OPOBJXY:
return OnOperateObjectTile(pCmd, player);
case CMD_DISARMXY:
return OnDisarm(pCmd, player);
case CMD_OPOBJT:
return OnOperateObjectTelekinesis(pCmd, pnum);
return OnOperateObjectTelekinesis(pCmd, player);
case CMD_ATTACKID:
return OnAttackMonster(pCmd, player);
case CMD_ATTACKPID:
return OnAttackPlayer(pCmd, player);
case CMD_RATTACKID:
return OnRangedAttackMonster(pCmd, pnum);
return OnRangedAttackMonster(pCmd, player);
case CMD_RATTACKPID:
return OnRangedAttackPlayer(pCmd, pnum);
return OnRangedAttackPlayer(pCmd, player);
case CMD_SPELLID:
return OnSpellMonster(pCmd, pnum);
return OnSpellMonster(pCmd, player);
case CMD_SPELLPID:
return OnSpellPlayer(pCmd, pnum);
return OnSpellPlayer(pCmd, player);
case CMD_TSPELLID:
return OnTargetSpellMonster(pCmd, pnum);
return OnTargetSpellMonster(pCmd, player);
case CMD_TSPELLPID:
return OnTargetSpellPlayer(pCmd, pnum);
return OnTargetSpellPlayer(pCmd, player);
case CMD_KNOCKBACK:
return OnKnockback(pCmd, pnum);
case CMD_RESURRECT:
@ -2594,7 +2613,7 @@ DWORD ParseCmd(int pnum, TCmd *pCmd)
case CMD_PLRDEAD:
return OnPlayerDeath(pCmd, pnum);
case CMD_PLRDAMAGE:
return OnPlayerDamage(pCmd, pnum);
return OnPlayerDamage(pCmd, player);
case CMD_OPENDOOR:
return OnOpenDoor(pCmd, pnum);
case CMD_CLOSEDOOR:
@ -2645,9 +2664,9 @@ DWORD ParseCmd(int pnum, TCmd *pCmd)
case CMD_NOVA:
return OnNova(pCmd, pnum);
case CMD_SETSHIELD:
return OnSetShield(pCmd, pnum);
return OnSetShield(pCmd, player);
case CMD_REMSHIELD:
return OnRemoveShield(pCmd, pnum);
return OnRemoveShield(pCmd, player);
case CMD_REFLECT:
return OnReflect(pCmd, pnum);
case CMD_NAKRUL:

51
Source/multi.cpp

@ -115,18 +115,19 @@ byte *ReceivePacket(TBuffer *pBuf, byte *body, size_t *size)
void NetReceivePlayerData(TPkt *pkt)
{
const Point target = Players[MyPlayerId].GetTargetPosition();
const auto &myPlayer = Players[MyPlayerId];
const Point target = myPlayer.GetTargetPosition();
pkt->hdr.wCheck = LoadBE32("\0\0ip");
pkt->hdr.px = Players[MyPlayerId].position.tile.x;
pkt->hdr.py = Players[MyPlayerId].position.tile.y;
pkt->hdr.px = myPlayer.position.tile.x;
pkt->hdr.py = myPlayer.position.tile.y;
pkt->hdr.targx = target.x;
pkt->hdr.targy = target.y;
pkt->hdr.php = Players[MyPlayerId]._pHitPoints;
pkt->hdr.pmhp = Players[MyPlayerId]._pMaxHP;
pkt->hdr.bstr = Players[MyPlayerId]._pBaseStr;
pkt->hdr.bmag = Players[MyPlayerId]._pBaseMag;
pkt->hdr.bdex = Players[MyPlayerId]._pBaseDex;
pkt->hdr.php = myPlayer._pHitPoints;
pkt->hdr.pmhp = myPlayer._pMaxHP;
pkt->hdr.bstr = myPlayer._pBaseStr;
pkt->hdr.bmag = myPlayer._pBaseMag;
pkt->hdr.bdex = myPlayer._pBaseDex;
}
void SendPacket(int playerId, void *packet, BYTE dwSize)
@ -179,7 +180,9 @@ void ParseTurn(int pnum, uint32_t turn)
void PlayerLeftMsg(int pnum, bool left)
{
if (!Players[pnum].plractive) {
auto &player = Players[pnum];
if (!player.plractive) {
return;
}
@ -199,11 +202,11 @@ void PlayerLeftMsg(int pnum, bool left)
pszFmt = _("Player '{:s}' dropped due to timeout");
break;
}
EventPlrMsg(fmt::format(pszFmt, Players[pnum]._pName).c_str());
EventPlrMsg(fmt::format(pszFmt, player._pName).c_str());
}
Players[pnum].plractive = false;
Players[pnum]._pName[0] = '\0';
ResetPlayerGFX(Players[pnum]);
player.plractive = false;
player._pName[0] = '\0';
ResetPlayerGFX(player);
gbActivePlayers--;
}
@ -358,13 +361,16 @@ void SetupLocalPositions()
x += plrxoff[MyPlayerId];
y += plryoff[MyPlayerId];
Players[MyPlayerId].position.tile = { x, y };
Players[MyPlayerId].position.future = { x, y };
Players[MyPlayerId].plrlevel = currlevel;
Players[MyPlayerId]._pLvlChanging = true;
Players[MyPlayerId].pLvlLoad = 0;
Players[MyPlayerId]._pmode = PM_NEWLVL;
Players[MyPlayerId].destAction = ACTION_NONE;
auto &myPlayer = Players[MyPlayerId];
myPlayer.position.tile = { x, y };
myPlayer.position.future = { x, y };
myPlayer.plrlevel = currlevel;
myPlayer._pLvlChanging = true;
myPlayer.pLvlLoad = 0;
myPlayer._pmode = PM_NEWLVL;
myPlayer.destAction = ACTION_NONE;
}
void HandleEvents(_SNETEVENT *pEvt)
@ -751,8 +757,9 @@ bool NetInit(bool bSinglePlayer)
SetupLocalPositions();
SendPlayerInfo(-2, CMD_SEND_PLRINFO);
ResetPlayerGFX(Players[MyPlayerId]);
Players[MyPlayerId].plractive = true;
auto &myPlayer = Players[MyPlayerId];
ResetPlayerGFX(myPlayer);
myPlayer.plractive = true;
gbActivePlayers = 1;
if (!sgbPlayerTurnBitTbl[MyPlayerId] || msg_wait_resync())

513
Source/objects.cpp

@ -732,9 +732,10 @@ void AddDiabObjs()
void AddCryptObject(int i, int a2)
{
if (a2 > 5) {
auto &myPlayer = Players[MyPlayerId];
switch (a2) {
case 6:
switch (Players[MyPlayerId]._pClass) {
switch (myPlayer._pClass) {
case HeroClass::Warrior:
case HeroClass::Barbarian:
Objects[i]._oVar2 = TEXT_BOOKA;
@ -754,7 +755,7 @@ void AddCryptObject(int i, int a2)
}
break;
case 7:
switch (Players[MyPlayerId]._pClass) {
switch (myPlayer._pClass) {
case HeroClass::Warrior:
case HeroClass::Barbarian:
Objects[i]._oVar2 = TEXT_BOOKB;
@ -774,7 +775,7 @@ void AddCryptObject(int i, int a2)
}
break;
case 8:
switch (Players[MyPlayerId]._pClass) {
switch (myPlayer._pClass) {
case HeroClass::Warrior:
case HeroClass::Barbarian:
Objects[i]._oVar2 = TEXT_BOOKC;
@ -1443,7 +1444,9 @@ void UpdateObjectLight(int i, int lightRadius)
void UpdateCircle(int i)
{
if (Players[MyPlayerId].position.tile != Objects[i].position) {
auto &myPlayer = Players[MyPlayerId];
if (myPlayer.position.tile != Objects[i].position) {
if (Objects[i]._otype == OBJ_MCIRCLE1)
Objects[i]._oAnimFrame = 1;
if (Objects[i]._otype == OBJ_MCIRCLE2)
@ -1470,10 +1473,10 @@ void UpdateCircle(int i)
ObjChangeMapResync(Objects[i]._oVar1, Objects[i]._oVar2, Objects[i]._oVar3, Objects[i]._oVar4);
if (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE && Quests[Q_BETRAYER]._qvar1 <= 4) // BUGFIX stepping on the circle again will break the quest state (fixed)
Quests[Q_BETRAYER]._qvar1 = 4;
AddMissile(Players[MyPlayerId].position.tile, { 35, 46 }, Players[MyPlayerId]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, MyPlayerId, 0, 0);
AddMissile(myPlayer.position.tile, { 35, 46 }, myPlayer._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, MyPlayerId, 0, 0);
track_repeat_walk(false);
sgbMouseDown = CLICK_NONE;
ClrPlrPath(Players[MyPlayerId]);
ClrPlrPath(myPlayer);
StartStand(MyPlayerId, DIR_S);
}
}
@ -1582,19 +1585,21 @@ void UpdateBurningCrossDamage(int i)
{
int damage[4] = { 6, 8, 10, 12 };
if (Players[MyPlayerId]._pmode == PM_DEATH)
auto &myPlayer = Players[MyPlayerId];
if (myPlayer._pmode == PM_DEATH)
return;
int8_t fireResist = Players[MyPlayerId]._pFireResist;
int8_t fireResist = myPlayer._pFireResist;
if (fireResist > 0)
damage[leveltype - 1] -= fireResist * damage[leveltype - 1] / 100;
if (Players[MyPlayerId].position.tile.x != Objects[i].position.x || Players[MyPlayerId].position.tile.y != Objects[i].position.y - 1)
if (myPlayer.position.tile.x != Objects[i].position.x || myPlayer.position.tile.y != Objects[i].position.y - 1)
return;
ApplyPlrDamage(MyPlayerId, 0, 0, damage[leveltype - 1]);
if (Players[MyPlayerId]._pHitPoints >> 6 > 0) {
Players[MyPlayerId].Say(HeroSpeech::Argh);
if (myPlayer._pHitPoints >> 6 > 0) {
myPlayer.Say(HeroSpeech::Argh);
}
}
@ -2177,6 +2182,8 @@ void OperateBook(int pnum, int i)
int dx;
int dy;
auto &player = Players[pnum];
if (Objects[i]._oSelFlag == 0)
return;
if (setlevel && setlvlnum == SL_VILEBETRAYER) {
@ -2199,7 +2206,7 @@ void OperateBook(int pnum, int i)
}
if (doAddMissile) {
Objects[dObject[35][36] - 1]._oVar5++;
AddMissile(Players[pnum].position.tile, { dx, dy }, Players[pnum]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 0);
AddMissile(player.position.tile, { dx, dy }, player._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 0);
missileAdded = true;
doAddMissile = false;
}
@ -2213,17 +2220,17 @@ void OperateBook(int pnum, int i)
return;
if (setlvlnum == SL_BONECHAMB) {
Players[pnum]._pMemSpells |= GetSpellBitmask(SPL_GUARDIAN);
if (Players[pnum]._pSplLvl[SPL_GUARDIAN] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[SPL_GUARDIAN]++;
player._pMemSpells |= GetSpellBitmask(SPL_GUARDIAN);
if (player._pSplLvl[SPL_GUARDIAN] < MAX_SPELL_LEVEL)
player._pSplLvl[SPL_GUARDIAN]++;
Quests[Q_SCHAMB]._qactive = QUEST_DONE;
if (!deltaload)
PlaySfxLoc(IS_QUESTDN, Objects[i].position);
InitDiabloMsg(EMSG_BONECHAMB);
AddMissile(
Players[pnum].position.tile,
player.position.tile,
Objects[i].position + Displacement { -2, -4 },
Players[pnum]._pdir,
player._pdir,
MIS_GUARDIAN,
TARGET_MONSTERS,
pnum,
@ -2353,7 +2360,8 @@ void OperateChest(int pnum, int i, bool sendmsg)
}
}
if (Objects[i]._oTrapFlag && Objects[i]._otype >= OBJ_TCHEST1 && Objects[i]._otype <= OBJ_TCHEST3) {
Direction mdir = GetDirection(Objects[i].position, Players[pnum].position.tile);
auto &player = Players[pnum];
Direction mdir = GetDirection(Objects[i].position, player.position.tile);
int mtype;
switch (Objects[i]._oVar4) {
case 0:
@ -2377,7 +2385,7 @@ void OperateChest(int pnum, int i, bool sendmsg)
default:
mtype = MIS_ARROW;
}
AddMissile(Objects[i].position, Players[pnum].position.tile, mdir, mtype, TARGET_PLAYERS, -1, 0, 0);
AddMissile(Objects[i].position, player.position.tile, mdir, mtype, TARGET_PLAYERS, -1, 0, 0);
Objects[i]._oTrapFlag = false;
}
if (pnum == MyPlayerId)
@ -2445,17 +2453,20 @@ void OperateSlainHero(int pnum, int i)
if (deltaload) {
return;
}
if (Players[pnum]._pClass == HeroClass::Warrior) {
auto &player = Players[pnum];
if (player._pClass == HeroClass::Warrior) {
CreateMagicArmor(Objects[i].position, ITYPE_HARMOR, ICURS_BREAST_PLATE, false, true);
} else if (Players[pnum]._pClass == HeroClass::Rogue) {
} else if (player._pClass == HeroClass::Rogue) {
CreateMagicWeapon(Objects[i].position, ITYPE_BOW, ICURS_LONG_WAR_BOW, false, true);
} else if (Players[pnum]._pClass == HeroClass::Sorcerer) {
} else if (player._pClass == HeroClass::Sorcerer) {
CreateSpellBook(Objects[i].position, SPL_LIGHTNING, false, true);
} else if (Players[pnum]._pClass == HeroClass::Monk) {
} else if (player._pClass == HeroClass::Monk) {
CreateMagicWeapon(Objects[i].position, ITYPE_STAFF, ICURS_WAR_STAFF, false, true);
} else if (Players[pnum]._pClass == HeroClass::Bard) {
} else if (player._pClass == HeroClass::Bard) {
CreateMagicWeapon(Objects[i].position, ITYPE_SWORD, ICURS_BASTARD_SWORD, false, true);
} else if (Players[pnum]._pClass == HeroClass::Barbarian) {
} else if (player._pClass == HeroClass::Barbarian) {
CreateMagicWeapon(Objects[i].position, ITYPE_AXE, ICURS_BATTLE_AXE, false, true);
}
Players[MyPlayerId].Say(HeroSpeech::RestInPeaceMyFriend);
@ -2610,13 +2621,15 @@ bool OperateShrineHidden(int pnum)
if (pnum != MyPlayerId)
return false;
auto &player = Players[pnum];
int cnt = 0;
for (const auto &item : Players[pnum].InvBody) {
for (const auto &item : player.InvBody) {
if (!item.isEmpty())
cnt++;
}
if (cnt > 0) {
for (auto &item : Players[pnum].InvBody) {
for (auto &item : player.InvBody) {
if (!item.isEmpty()
&& item._iMaxDur != DUR_INDESTRUCTIBLE
&& item._iMaxDur != 0) {
@ -2628,7 +2641,7 @@ bool OperateShrineHidden(int pnum)
}
while (true) {
cnt = 0;
for (auto &item : Players[pnum].InvBody) {
for (auto &item : player.InvBody) {
if (!item.isEmpty() && item._iMaxDur != DUR_INDESTRUCTIBLE && item._iMaxDur != 0) {
cnt++;
}
@ -2636,15 +2649,15 @@ bool OperateShrineHidden(int pnum)
if (cnt == 0)
break;
int r = GenerateRnd(NUM_INVLOC);
if (Players[pnum].InvBody[r].isEmpty() || Players[pnum].InvBody[r]._iMaxDur == DUR_INDESTRUCTIBLE || Players[pnum].InvBody[r]._iMaxDur == 0)
if (player.InvBody[r].isEmpty() || player.InvBody[r]._iMaxDur == DUR_INDESTRUCTIBLE || player.InvBody[r]._iMaxDur == 0)
continue;
Players[pnum].InvBody[r]._iDurability -= 20;
Players[pnum].InvBody[r]._iMaxDur -= 20;
if (Players[pnum].InvBody[r]._iDurability <= 0)
Players[pnum].InvBody[r]._iDurability = 1;
if (Players[pnum].InvBody[r]._iMaxDur <= 0)
Players[pnum].InvBody[r]._iMaxDur = 1;
player.InvBody[r]._iDurability -= 20;
player.InvBody[r]._iMaxDur -= 20;
if (player.InvBody[r]._iDurability <= 0)
player.InvBody[r]._iDurability = 1;
if (player.InvBody[r]._iMaxDur <= 0)
player.InvBody[r]._iMaxDur = 1;
break;
}
}
@ -2661,46 +2674,48 @@ bool OperateShrineGloomy(int pnum)
if (pnum != MyPlayerId)
return true;
if (!Players[pnum].InvBody[INVLOC_HEAD].isEmpty())
Players[pnum].InvBody[INVLOC_HEAD]._iAC += 2;
if (!Players[pnum].InvBody[INVLOC_CHEST].isEmpty())
Players[pnum].InvBody[INVLOC_CHEST]._iAC += 2;
if (!Players[pnum].InvBody[INVLOC_HAND_LEFT].isEmpty()) {
if (Players[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {
Players[pnum].InvBody[INVLOC_HAND_LEFT]._iAC += 2;
auto &player = Players[pnum];
if (!player.InvBody[INVLOC_HEAD].isEmpty())
player.InvBody[INVLOC_HEAD]._iAC += 2;
if (!player.InvBody[INVLOC_CHEST].isEmpty())
player.InvBody[INVLOC_CHEST]._iAC += 2;
if (!player.InvBody[INVLOC_HAND_LEFT].isEmpty()) {
if (player.InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {
player.InvBody[INVLOC_HAND_LEFT]._iAC += 2;
} else {
Players[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam--;
if (Players[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam < Players[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam)
Players[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam = Players[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam;
player.InvBody[INVLOC_HAND_LEFT]._iMaxDam--;
if (player.InvBody[INVLOC_HAND_LEFT]._iMaxDam < player.InvBody[INVLOC_HAND_LEFT]._iMinDam)
player.InvBody[INVLOC_HAND_LEFT]._iMaxDam = player.InvBody[INVLOC_HAND_LEFT]._iMinDam;
}
}
if (!Players[pnum].InvBody[INVLOC_HAND_RIGHT].isEmpty()) {
if (Players[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {
Players[pnum].InvBody[INVLOC_HAND_RIGHT]._iAC += 2;
if (!player.InvBody[INVLOC_HAND_RIGHT].isEmpty()) {
if (player.InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {
player.InvBody[INVLOC_HAND_RIGHT]._iAC += 2;
} else {
Players[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam--;
if (Players[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam < Players[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam)
Players[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam = Players[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam;
player.InvBody[INVLOC_HAND_RIGHT]._iMaxDam--;
if (player.InvBody[INVLOC_HAND_RIGHT]._iMaxDam < player.InvBody[INVLOC_HAND_RIGHT]._iMinDam)
player.InvBody[INVLOC_HAND_RIGHT]._iMaxDam = player.InvBody[INVLOC_HAND_RIGHT]._iMinDam;
}
}
for (int j = 0; j < Players[pnum]._pNumInv; j++) {
switch (Players[pnum].InvList[j]._itype) {
for (int j = 0; j < player._pNumInv; j++) {
switch (player.InvList[j]._itype) {
case ITYPE_SWORD:
case ITYPE_AXE:
case ITYPE_BOW:
case ITYPE_MACE:
case ITYPE_STAFF:
Players[pnum].InvList[j]._iMaxDam--;
if (Players[pnum].InvList[j]._iMaxDam < Players[pnum].InvList[j]._iMinDam)
Players[pnum].InvList[j]._iMaxDam = Players[pnum].InvList[j]._iMinDam;
player.InvList[j]._iMaxDam--;
if (player.InvList[j]._iMaxDam < player.InvList[j]._iMinDam)
player.InvList[j]._iMaxDam = player.InvList[j]._iMinDam;
break;
case ITYPE_SHIELD:
case ITYPE_HELM:
case ITYPE_LARMOR:
case ITYPE_MARMOR:
case ITYPE_HARMOR:
Players[pnum].InvList[j]._iAC += 2;
player.InvList[j]._iAC += 2;
break;
default:
break;
@ -2719,19 +2734,21 @@ bool OperateShrineWeird(int pnum)
if (pnum != MyPlayerId)
return true;
if (!Players[pnum].InvBody[INVLOC_HAND_LEFT].isEmpty() && Players[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_SHIELD)
Players[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam++;
if (!Players[pnum].InvBody[INVLOC_HAND_RIGHT].isEmpty() && Players[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_SHIELD)
Players[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam++;
auto &player = Players[pnum];
for (int j = 0; j < Players[pnum]._pNumInv; j++) {
switch (Players[pnum].InvList[j]._itype) {
if (!player.InvBody[INVLOC_HAND_LEFT].isEmpty() && player.InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_SHIELD)
player.InvBody[INVLOC_HAND_LEFT]._iMaxDam++;
if (!player.InvBody[INVLOC_HAND_RIGHT].isEmpty() && player.InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_SHIELD)
player.InvBody[INVLOC_HAND_RIGHT]._iMaxDam++;
for (int j = 0; j < player._pNumInv; j++) {
switch (player.InvList[j]._itype) {
case ITYPE_SWORD:
case ITYPE_AXE:
case ITYPE_BOW:
case ITYPE_MACE:
case ITYPE_STAFF:
Players[pnum].InvList[j]._iMaxDam++;
player.InvList[j]._iMaxDam++;
break;
default:
break;
@ -2748,10 +2765,12 @@ bool OperateShrineMagical(int pnum)
if (deltaload)
return false;
auto &player = Players[pnum];
AddMissile(
Players[pnum].position.tile,
Players[pnum].position.tile,
Players[pnum]._pdir,
player.position.tile,
player.position.tile,
player._pdir,
MIS_MANASHIELD,
-1,
pnum,
@ -2773,15 +2792,17 @@ bool OperateShrineStone(int pnum)
if (pnum != MyPlayerId)
return true;
for (auto &item : Players[pnum].InvBody) {
auto &player = Players[pnum];
for (auto &item : player.InvBody) {
if (item._itype == ITYPE_STAFF)
item._iCharges = item._iMaxCharges;
}
for (int j = 0; j < Players[pnum]._pNumInv; j++) {
if (Players[pnum].InvList[j]._itype == ITYPE_STAFF)
Players[pnum].InvList[j]._iCharges = Players[pnum].InvList[j]._iMaxCharges;
for (int j = 0; j < player._pNumInv; j++) {
if (player.InvList[j]._itype == ITYPE_STAFF)
player.InvList[j]._iCharges = player.InvList[j]._iMaxCharges;
}
for (auto &item : Players[pnum].SpdList) {
for (auto &item : player.SpdList) {
if (item._itype == ITYPE_STAFF)
item._iCharges = item._iMaxCharges; // belt items don't have charges?
}
@ -2798,11 +2819,13 @@ bool OperateShrineReligious(int pnum)
if (pnum != MyPlayerId)
return true;
for (auto &item : Players[pnum].InvBody)
auto &player = Players[pnum];
for (auto &item : player.InvBody)
item._iDurability = item._iMaxDur;
for (int j = 0; j < Players[pnum]._pNumInv; j++)
Players[pnum].InvList[j]._iDurability = Players[pnum].InvList[j]._iMaxDur;
for (auto &item : Players[pnum].SpdList)
for (int j = 0; j < player._pNumInv; j++)
player.InvList[j]._iDurability = player.InvList[j]._iMaxDur;
for (auto &item : player.SpdList)
item._iDurability = item._iMaxDur; // belt items don't have durability?
InitDiabloMsg(EMSG_SHRINE_RELIGIOUS);
@ -2817,10 +2840,12 @@ bool OperateShrineEnchanted(int pnum)
if (pnum != MyPlayerId)
return false;
auto &player = Players[pnum];
int cnt = 0;
uint64_t spell = 1;
int maxSpells = gbIsHellfire ? MAX_SPELLS : 37;
uint64_t spells = Players[pnum]._pMemSpells;
uint64_t spells = player._pMemSpells;
for (int j = 0; j < maxSpells; j++) {
if ((spell & spells) != 0)
cnt++;
@ -2829,20 +2854,20 @@ bool OperateShrineEnchanted(int pnum)
if (cnt > 1) {
spell = 1;
for (int j = SPL_FIREBOLT; j < maxSpells; j++) { // BUGFIX: < MAX_SPELLS, there is no spell with MAX_SPELLS index (fixed)
if ((Players[pnum]._pMemSpells & spell) != 0) {
if (Players[pnum]._pSplLvl[j] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[j]++;
if ((player._pMemSpells & spell) != 0) {
if (player._pSplLvl[j] < MAX_SPELL_LEVEL)
player._pSplLvl[j]++;
}
spell *= 2;
}
int r;
do {
r = GenerateRnd(maxSpells);
} while ((Players[pnum]._pMemSpells & GetSpellBitmask(r + 1)) == 0);
if (Players[pnum]._pSplLvl[r + 1] >= 2)
Players[pnum]._pSplLvl[r + 1] -= 2;
} while ((player._pMemSpells & GetSpellBitmask(r + 1)) == 0);
if (player._pSplLvl[r + 1] >= 2)
player._pSplLvl[r + 1] -= 2;
else
Players[pnum]._pSplLvl[r + 1] = 0;
player._pSplLvl[r + 1] = 0;
}
InitDiabloMsg(EMSG_SHRINE_ENCHANTED);
@ -2880,27 +2905,29 @@ bool OperateShrineFascinating(int pnum)
if (pnum != MyPlayerId)
return false;
Players[pnum]._pMemSpells |= GetSpellBitmask(SPL_FIREBOLT);
auto &player = Players[pnum];
player._pMemSpells |= GetSpellBitmask(SPL_FIREBOLT);
if (Players[pnum]._pSplLvl[SPL_FIREBOLT] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[SPL_FIREBOLT]++;
if (Players[pnum]._pSplLvl[SPL_FIREBOLT] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[SPL_FIREBOLT]++;
if (player._pSplLvl[SPL_FIREBOLT] < MAX_SPELL_LEVEL)
player._pSplLvl[SPL_FIREBOLT]++;
if (player._pSplLvl[SPL_FIREBOLT] < MAX_SPELL_LEVEL)
player._pSplLvl[SPL_FIREBOLT]++;
DWORD t = Players[pnum]._pMaxManaBase / 10;
int v1 = Players[pnum]._pMana - Players[pnum]._pManaBase;
int v2 = Players[pnum]._pMaxMana - Players[pnum]._pMaxManaBase;
Players[pnum]._pManaBase -= t;
Players[pnum]._pMana -= t;
Players[pnum]._pMaxMana -= t;
Players[pnum]._pMaxManaBase -= t;
if (Players[pnum]._pMana >> 6 <= 0) {
Players[pnum]._pMana = v1;
Players[pnum]._pManaBase = 0;
DWORD t = player._pMaxManaBase / 10;
int v1 = player._pMana - player._pManaBase;
int v2 = player._pMaxMana - player._pMaxManaBase;
player._pManaBase -= t;
player._pMana -= t;
player._pMaxMana -= t;
player._pMaxManaBase -= t;
if (player._pMana >> 6 <= 0) {
player._pMana = v1;
player._pManaBase = 0;
}
if (Players[pnum]._pMaxMana >> 6 <= 0) {
Players[pnum]._pMaxMana = v2;
Players[pnum]._pMaxManaBase = 0;
if (player._pMaxMana >> 6 <= 0) {
player._pMaxMana = v2;
player._pMaxManaBase = 0;
}
InitDiabloMsg(EMSG_SHRINE_FASCINATING);
@ -2913,10 +2940,12 @@ bool OperateShrineCryptic(int pnum)
if (deltaload)
return false;
auto &player = Players[pnum];
AddMissile(
Players[pnum].position.tile,
Players[pnum].position.tile,
Players[pnum]._pdir,
player.position.tile,
player.position.tile,
player._pdir,
MIS_NOVA,
-1,
pnum,
@ -2926,8 +2955,8 @@ bool OperateShrineCryptic(int pnum)
if (pnum != MyPlayerId)
return false;
Players[pnum]._pMana = Players[pnum]._pMaxMana;
Players[pnum]._pManaBase = Players[pnum]._pMaxManaBase;
player._pMana = player._pMaxMana;
player._pManaBase = player._pMaxManaBase;
InitDiabloMsg(EMSG_SHRINE_CRYPTIC);
@ -2942,39 +2971,41 @@ bool OperateShrineEldritch(int pnum)
if (pnum != MyPlayerId)
return true;
for (int j = 0; j < Players[pnum]._pNumInv; j++) {
if (Players[pnum].InvList[j]._itype == ITYPE_MISC) {
if (Players[pnum].InvList[j]._iMiscId == IMISC_HEAL
|| Players[pnum].InvList[j]._iMiscId == IMISC_MANA) {
SetPlrHandItem(&Players[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&Players[pnum].HoldItem);
Players[pnum].HoldItem._iStatFlag = true;
Players[pnum].InvList[j] = Players[pnum].HoldItem;
auto &player = Players[pnum];
for (int j = 0; j < player._pNumInv; j++) {
if (player.InvList[j]._itype == ITYPE_MISC) {
if (player.InvList[j]._iMiscId == IMISC_HEAL
|| player.InvList[j]._iMiscId == IMISC_MANA) {
SetPlrHandItem(&player.HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&player.HoldItem);
player.HoldItem._iStatFlag = true;
player.InvList[j] = player.HoldItem;
}
if (Players[pnum].InvList[j]._iMiscId == IMISC_FULLHEAL
|| Players[pnum].InvList[j]._iMiscId == IMISC_FULLMANA) {
SetPlrHandItem(&Players[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&Players[pnum].HoldItem);
Players[pnum].HoldItem._iStatFlag = true;
Players[pnum].InvList[j] = Players[pnum].HoldItem;
if (player.InvList[j]._iMiscId == IMISC_FULLHEAL
|| player.InvList[j]._iMiscId == IMISC_FULLMANA) {
SetPlrHandItem(&player.HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&player.HoldItem);
player.HoldItem._iStatFlag = true;
player.InvList[j] = player.HoldItem;
}
}
}
for (auto &item : Players[pnum].SpdList) {
for (auto &item : player.SpdList) {
if (item._itype == ITYPE_MISC) {
if (item._iMiscId == IMISC_HEAL
|| item._iMiscId == IMISC_MANA) {
SetPlrHandItem(&Players[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&Players[pnum].HoldItem);
Players[pnum].HoldItem._iStatFlag = true;
item = Players[pnum].HoldItem;
SetPlrHandItem(&player.HoldItem, ItemMiscIdIdx(IMISC_REJUV));
GetPlrHandSeed(&player.HoldItem);
player.HoldItem._iStatFlag = true;
item = player.HoldItem;
}
if (item._iMiscId == IMISC_FULLHEAL
|| item._iMiscId == IMISC_FULLMANA) {
SetPlrHandItem(&Players[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&Players[pnum].HoldItem);
Players[pnum].HoldItem._iStatFlag = true;
item = Players[pnum].HoldItem;
SetPlrHandItem(&player.HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
GetPlrHandSeed(&player.HoldItem);
player.HoldItem._iStatFlag = true;
item = player.HoldItem;
}
}
}
@ -3014,6 +3045,8 @@ bool OperateShrineDivine(int pnum, Point spawnPosition)
if (pnum != MyPlayerId)
return false;
auto &player = Players[pnum];
if (currlevel < 4) {
CreateTypeItem(spawnPosition, false, ITYPE_MISC, IMISC_FULLMANA, false, true);
CreateTypeItem(spawnPosition, false, ITYPE_MISC, IMISC_FULLHEAL, false, true);
@ -3022,10 +3055,10 @@ bool OperateShrineDivine(int pnum, Point spawnPosition)
CreateTypeItem(spawnPosition, false, ITYPE_MISC, IMISC_FULLREJUV, false, true);
}
Players[pnum]._pMana = Players[pnum]._pMaxMana;
Players[pnum]._pManaBase = Players[pnum]._pMaxManaBase;
Players[pnum]._pHitPoints = Players[pnum]._pMaxHP;
Players[pnum]._pHPBase = Players[pnum]._pMaxHPBase;
player._pMana = player._pMaxMana;
player._pManaBase = player._pMaxManaBase;
player._pHitPoints = player._pMaxHP;
player._pHPBase = player._pMaxHPBase;
InitDiabloMsg(EMSG_SHRINE_DIVINE);
@ -3037,6 +3070,8 @@ bool OperateShrineHoly(int pnum)
if (deltaload)
return false;
auto &player = Players[pnum];
int j = 0;
int xx;
int yy;
@ -3050,7 +3085,7 @@ bool OperateShrineHoly(int pnum)
break;
} while (nSolidTable[lv] || dObject[xx][yy] != 0 || dMonster[xx][yy] != 0);
AddMissile(Players[pnum].position.tile, { xx, yy }, Players[pnum]._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype);
AddMissile(player.position.tile, { xx, yy }, player._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype);
if (pnum != MyPlayerId)
return false;
@ -3062,30 +3097,34 @@ bool OperateShrineHoly(int pnum)
bool OperateShrineSacred(int pnum)
{
if (deltaload || pnum != MyPlayerId)
if (deltaload)
return false;
if (pnum != MyPlayerId)
return false;
Players[pnum]._pMemSpells |= GetSpellBitmask(SPL_CBOLT);
auto &player = Players[pnum];
player._pMemSpells |= GetSpellBitmask(SPL_CBOLT);
if (Players[pnum]._pSplLvl[SPL_CBOLT] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[SPL_CBOLT]++;
if (Players[pnum]._pSplLvl[SPL_CBOLT] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[SPL_CBOLT]++;
if (player._pSplLvl[SPL_CBOLT] < MAX_SPELL_LEVEL)
player._pSplLvl[SPL_CBOLT]++;
if (player._pSplLvl[SPL_CBOLT] < MAX_SPELL_LEVEL)
player._pSplLvl[SPL_CBOLT]++;
uint32_t t = Players[pnum]._pMaxManaBase / 10;
int v1 = Players[pnum]._pMana - Players[pnum]._pManaBase;
int v2 = Players[pnum]._pMaxMana - Players[pnum]._pMaxManaBase;
Players[pnum]._pManaBase -= t;
Players[pnum]._pMana -= t;
Players[pnum]._pMaxMana -= t;
Players[pnum]._pMaxManaBase -= t;
if (Players[pnum]._pMana >> 6 <= 0) {
Players[pnum]._pMana = v1;
Players[pnum]._pManaBase = 0;
uint32_t t = player._pMaxManaBase / 10;
int v1 = player._pMana - player._pManaBase;
int v2 = player._pMaxMana - player._pMaxManaBase;
player._pManaBase -= t;
player._pMana -= t;
player._pMaxMana -= t;
player._pMaxManaBase -= t;
if (player._pMana >> 6 <= 0) {
player._pMana = v1;
player._pManaBase = 0;
}
if (Players[pnum]._pMaxMana >> 6 <= 0) {
Players[pnum]._pMaxMana = v2;
Players[pnum]._pMaxManaBase = 0;
if (player._pMaxMana >> 6 <= 0) {
player._pMaxMana = v2;
player._pMaxManaBase = 0;
}
InitDiabloMsg(EMSG_SHRINE_SACRED);
@ -3100,17 +3139,19 @@ bool OperateShrineSpiritual(int pnum)
if (pnum != MyPlayerId)
return false;
for (int8_t &gridItem : Players[pnum].InvGrid) {
auto &player = Players[pnum];
for (int8_t &gridItem : player.InvGrid) {
if (gridItem == 0) {
int r = 5 * leveltype + GenerateRnd(10 * leveltype);
DWORD t = Players[pnum]._pNumInv; // check
Players[pnum].InvList[t] = golditem;
Players[pnum].InvList[t]._iSeed = AdvanceRndSeed();
Players[pnum]._pNumInv++;
gridItem = Players[pnum]._pNumInv;
Players[pnum].InvList[t]._ivalue = r;
Players[pnum]._pGold += r;
SetPlrHandGoldCurs(&Players[pnum].InvList[t]);
DWORD t = player._pNumInv; // check
player.InvList[t] = golditem;
player.InvList[t]._iSeed = AdvanceRndSeed();
player._pNumInv++;
gridItem = player._pNumInv;
player.InvList[t]._ivalue = r;
player._pGold += r;
SetPlrHandGoldCurs(&player.InvList[t]);
}
}
@ -3129,10 +3170,12 @@ bool OperateShrineSpooky(int pnum)
return true;
}
Players[MyPlayerId]._pHitPoints = Players[MyPlayerId]._pMaxHP;
Players[MyPlayerId]._pHPBase = Players[MyPlayerId]._pMaxHPBase;
Players[MyPlayerId]._pMana = Players[MyPlayerId]._pMaxMana;
Players[MyPlayerId]._pManaBase = Players[MyPlayerId]._pMaxManaBase;
auto &myPlayer = Players[MyPlayerId];
myPlayer._pHitPoints = myPlayer._pMaxHP;
myPlayer._pHPBase = myPlayer._pMaxHPBase;
myPlayer._pMana = myPlayer._pMaxMana;
myPlayer._pManaBase = myPlayer._pMaxManaBase;
InitDiabloMsg(EMSG_SHRINE_SPOOKY2);
@ -3214,26 +3257,28 @@ bool OperateShrineOrnate(int pnum)
if (pnum != MyPlayerId)
return false;
Players[pnum]._pMemSpells |= GetSpellBitmask(SPL_HBOLT);
if (Players[pnum]._pSplLvl[SPL_HBOLT] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[SPL_HBOLT]++;
if (Players[pnum]._pSplLvl[SPL_HBOLT] < MAX_SPELL_LEVEL)
Players[pnum]._pSplLvl[SPL_HBOLT]++;
auto &player = Players[pnum];
uint32_t t = Players[pnum]._pMaxManaBase / 10;
int v1 = Players[pnum]._pMana - Players[pnum]._pManaBase;
int v2 = Players[pnum]._pMaxMana - Players[pnum]._pMaxManaBase;
Players[pnum]._pManaBase -= t;
Players[pnum]._pMana -= t;
Players[pnum]._pMaxMana -= t;
Players[pnum]._pMaxManaBase -= t;
if (Players[pnum]._pMana >> 6 <= 0) {
Players[pnum]._pMana = v1;
Players[pnum]._pManaBase = 0;
player._pMemSpells |= GetSpellBitmask(SPL_HBOLT);
if (player._pSplLvl[SPL_HBOLT] < MAX_SPELL_LEVEL)
player._pSplLvl[SPL_HBOLT]++;
if (player._pSplLvl[SPL_HBOLT] < MAX_SPELL_LEVEL)
player._pSplLvl[SPL_HBOLT]++;
uint32_t t = player._pMaxManaBase / 10;
int v1 = player._pMana - player._pManaBase;
int v2 = player._pMaxMana - player._pMaxManaBase;
player._pManaBase -= t;
player._pMana -= t;
player._pMaxMana -= t;
player._pMaxManaBase -= t;
if (player._pMana >> 6 <= 0) {
player._pMana = v1;
player._pManaBase = 0;
}
if (Players[pnum]._pMaxMana >> 6 <= 0) {
Players[pnum]._pMaxMana = v2;
Players[pnum]._pMaxManaBase = 0;
if (player._pMaxMana >> 6 <= 0) {
player._pMaxMana = v2;
player._pMaxManaBase = 0;
}
InitDiabloMsg(EMSG_SHRINE_ORNATE);
@ -3248,15 +3293,17 @@ bool OperateShrineGlimmering(int pnum)
if (pnum != MyPlayerId)
return false;
for (auto &item : Players[pnum].InvBody) {
auto &player = Players[pnum];
for (auto &item : player.InvBody) {
if (item._iMagical != ITEM_QUALITY_NORMAL && !item._iIdentified)
item._iIdentified = true;
}
for (int j = 0; j < Players[pnum]._pNumInv; j++) {
if (Players[pnum].InvList[j]._iMagical != ITEM_QUALITY_NORMAL && !Players[pnum].InvList[j]._iIdentified)
Players[pnum].InvList[j]._iIdentified = true;
for (int j = 0; j < player._pNumInv; j++) {
if (player.InvList[j]._iMagical != ITEM_QUALITY_NORMAL && !player.InvList[j]._iIdentified)
player.InvList[j]._iIdentified = true;
}
for (auto &item : Players[pnum].SpdList) {
for (auto &item : player.SpdList) {
if (item._iMagical != ITEM_QUALITY_NORMAL && !item._iIdentified)
item._iIdentified = true; // belt items can't be magical?
}
@ -3310,7 +3357,9 @@ bool OperateShrineOily(int pnum, Point spawnPosition)
if (pnum != MyPlayerId)
return false;
switch (Players[MyPlayerId]._pClass) {
auto &myPlayer = Players[MyPlayerId];
switch (myPlayer._pClass) {
case HeroClass::Warrior:
ModifyPlrStr(MyPlayerId, 2);
break;
@ -3337,8 +3386,8 @@ bool OperateShrineOily(int pnum, Point spawnPosition)
AddMissile(
spawnPosition,
Players[MyPlayerId].position.tile,
Players[MyPlayerId]._pdir,
myPlayer.position.tile,
myPlayer._pdir,
MIS_FIREWALL,
TARGET_PLAYERS,
-1,
@ -3357,7 +3406,9 @@ bool OperateShrineGlowing(int pnum)
if (pnum != MyPlayerId)
return false;
int playerXP = Players[MyPlayerId]._pExperience;
auto &myPlayer = Players[MyPlayerId];
int playerXP = myPlayer._pExperience;
int magicGain = playerXP / 1000;
int xpLoss = 0;
if (playerXP > 5000) {
@ -3365,7 +3416,7 @@ bool OperateShrineGlowing(int pnum)
xpLoss = static_cast<int>(playerXP * 0.95);
}
ModifyPlrMag(MyPlayerId, magicGain);
Players[MyPlayerId]._pExperience = xpLoss;
myPlayer._pExperience = xpLoss;
if (sgOptions.Gameplay.bExperienceBar) {
force_redraw = 255;
@ -3385,8 +3436,10 @@ bool OperateShrineMendicant(int pnum)
if (pnum != MyPlayerId)
return false;
int gold = Players[MyPlayerId]._pGold / 2;
AddPlrExperience(MyPlayerId, Players[MyPlayerId]._pLevel, gold);
auto &myPlayer = Players[MyPlayerId];
int gold = myPlayer._pGold / 2;
AddPlrExperience(MyPlayerId, myPlayer._pLevel, gold);
TakePlrsMoney(gold);
CheckStats(Players[pnum]);
@ -3409,12 +3462,14 @@ bool OperateShrineSparkling(int pnum, Point spawnPosition)
if (pnum != MyPlayerId)
return false;
AddPlrExperience(MyPlayerId, Players[MyPlayerId]._pLevel, 1000 * currlevel);
auto &myPlayer = Players[MyPlayerId];
AddPlrExperience(MyPlayerId, myPlayer._pLevel, 1000 * currlevel);
AddMissile(
spawnPosition,
Players[MyPlayerId].position.tile,
Players[MyPlayerId]._pdir,
myPlayer.position.tile,
myPlayer._pdir,
MIS_FLASH,
TARGET_PLAYERS,
-1,
@ -3441,10 +3496,12 @@ bool OperateShrineTown(int pnum, Point spawnPosition)
if (pnum != MyPlayerId)
return false;
auto &myPlayer = Players[MyPlayerId];
AddMissile(
spawnPosition,
Players[MyPlayerId].position.tile,
Players[MyPlayerId]._pdir,
myPlayer.position.tile,
myPlayer._pdir,
MIS_TOWN,
TARGET_PLAYERS,
pnum,
@ -3463,8 +3520,10 @@ bool OperateShrineShimmering(int pnum)
if (pnum != MyPlayerId)
return false;
Players[pnum]._pMana = Players[pnum]._pMaxMana;
Players[pnum]._pManaBase = Players[pnum]._pMaxManaBase;
auto &player = Players[pnum];
player._pMana = player._pMaxMana;
player._pManaBase = player._pMaxManaBase;
InitDiabloMsg(EMSG_SHRINE_SHIMMERING);
@ -3506,8 +3565,10 @@ bool OperateShrineMurphys(int pnum)
if (pnum != MyPlayerId)
return false;
auto &myPlayer = Players[MyPlayerId];
bool broke = false;
for (auto &item : Players[MyPlayerId].InvBody) {
for (auto &item : myPlayer.InvBody) {
if (!item.isEmpty() && GenerateRnd(3) == 0) {
if (item._iDurability != DUR_INDESTRUCTIBLE) {
if (item._iDurability > 0) {
@ -3519,7 +3580,7 @@ bool OperateShrineMurphys(int pnum)
}
}
if (!broke) {
TakePlrsMoney(Players[MyPlayerId]._pGold / 3);
TakePlrsMoney(myPlayer._pGold / 3);
}
InitDiabloMsg(EMSG_SHRINE_MURPHYS);
@ -3839,6 +3900,7 @@ void OperateCauldron(int pnum, int i, _sfx_id sType)
bool OperateFountains(int pnum, int i)
{
auto &player = Players[pnum];
bool applied = false;
SetRndSeed(Objects[i]._oRndSeed);
switch (Objects[i]._otype) {
@ -3848,13 +3910,13 @@ bool OperateFountains(int pnum, int i)
if (pnum != MyPlayerId)
return false;
if (Players[pnum]._pHitPoints < Players[pnum]._pMaxHP) {
if (player._pHitPoints < player._pMaxHP) {
PlaySfxLoc(LS_FOUNTAIN, Objects[i].position);
Players[pnum]._pHitPoints += 64;
Players[pnum]._pHPBase += 64;
if (Players[pnum]._pHitPoints > Players[pnum]._pMaxHP) {
Players[pnum]._pHitPoints = Players[pnum]._pMaxHP;
Players[pnum]._pHPBase = Players[pnum]._pMaxHPBase;
player._pHitPoints += 64;
player._pHPBase += 64;
if (player._pHitPoints > player._pMaxHP) {
player._pHitPoints = player._pMaxHP;
player._pHPBase = player._pMaxHPBase;
}
applied = true;
} else
@ -3866,14 +3928,14 @@ bool OperateFountains(int pnum, int i)
if (pnum != MyPlayerId)
return false;
if (Players[pnum]._pMana < Players[pnum]._pMaxMana) {
if (player._pMana < player._pMaxMana) {
PlaySfxLoc(LS_FOUNTAIN, Objects[i].position);
Players[pnum]._pMana += 64;
Players[pnum]._pManaBase += 64;
if (Players[pnum]._pMana > Players[pnum]._pMaxMana) {
Players[pnum]._pMana = Players[pnum]._pMaxMana;
Players[pnum]._pManaBase = Players[pnum]._pMaxManaBase;
player._pMana += 64;
player._pManaBase += 64;
if (player._pMana > player._pMaxMana) {
player._pMana = player._pMaxMana;
player._pManaBase = player._pMaxManaBase;
}
applied = true;
@ -3889,9 +3951,9 @@ bool OperateFountains(int pnum, int i)
if (deltaload)
return false;
AddMissile(
Players[pnum].position.tile,
Players[pnum].position.tile,
Players[pnum]._pdir,
player.position.tile,
player.position.tile,
player._pdir,
MIS_INFRA,
-1,
pnum,
@ -3935,7 +3997,7 @@ bool OperateFountains(int pnum, int i)
}
}
CheckStats(Players[pnum]);
CheckStats(player);
applied = true;
if (pnum == MyPlayerId)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
@ -5268,10 +5330,11 @@ void BreakObject(int pnum, int oi)
{
int objdam = 10;
if (pnum != -1) {
int mind = Players[pnum]._pIMinDam;
int maxd = Players[pnum]._pIMaxDam;
auto &player = Players[pnum];
int mind = player._pIMinDam;
int maxd = player._pIMaxDam;
objdam = GenerateRnd(maxd - mind + 1) + mind;
objdam += Players[pnum]._pDamageMod + Players[pnum]._pIBonusDamMod + objdam * Players[pnum]._pIBonusDam / 100;
objdam += player._pDamageMod + player._pIBonusDamMod + objdam * player._pIBonusDam / 100;
}
switch (Objects[oi]._otype) {

32
Source/palette.cpp

@ -355,41 +355,41 @@ void palette_update_caves()
void palette_update_crypt()
{
static int LaveDelay = 0;
static int GlowDelay = 0;
static int laveDelay = 0;
static int glowDelay = 0;
if (LaveDelay > 1) {
if (laveDelay > 1) {
CycleColorsReverse(1, 15);
LaveDelay = 0;
laveDelay = 0;
} else {
LaveDelay++;
laveDelay++;
}
if (GlowDelay > 0) {
if (glowDelay > 0) {
CycleColorsReverse(16, 31);
palette_update();
GlowDelay++;
glowDelay++;
} else {
GlowDelay = 1;
glowDelay = 1;
}
}
void palette_update_hive()
{
static int WaveDelay = 0;
static int BubbleDelay = 0;
static int waveDelay = 0;
static int bubbleDelay = 0;
if (WaveDelay == 2) {
if (waveDelay == 2) {
CycleColorsReverse(1, 8);
WaveDelay = 0;
waveDelay = 0;
} else {
WaveDelay++;
waveDelay++;
}
if (BubbleDelay == 2) {
if (bubbleDelay == 2) {
CycleColorsReverse(9, 15);
palette_update();
BubbleDelay = 0;
bubbleDelay = 0;
} else {
BubbleDelay++;
bubbleDelay++;
}
}

19
Source/pfile.cpp

@ -273,11 +273,13 @@ void pfile_write_hero(bool writeGameData, bool clearTables)
RenameTempToPerm();
}
PkPlayerStruct pkplr;
PackPlayer(&pkplr, Players[MyPlayerId], !gbIsMultiplayer);
auto &myPlayer = Players[MyPlayerId];
PackPlayer(&pkplr, myPlayer, !gbIsMultiplayer);
EncodeHero(&pkplr);
if (!gbVanilla) {
SaveHotkeys();
SaveHeroItems(Players[MyPlayerId]);
SaveHeroItems(myPlayer);
}
}
@ -297,14 +299,15 @@ bool pfile_ui_set_hero_infos(bool (*uiAddHeroInfo)(_uiheroinfo *))
if (hasSaveGame)
pkplr.bIsHellfire = gbIsHellfireSaveGame ? 1 : 0;
auto &player = Players[0];
UnPackPlayer(&pkplr, 0, false);
CloseArchive(&archive);
LoadHeroItems(Players[0]);
RemoveEmptyInventory(Players[0]);
LoadHeroItems(player);
RemoveEmptyInventory(player);
CalcPlrInv(0, false);
Game2UiPlayer(Players[0], &uihero, hasSaveGame);
Game2UiPlayer(player, &uihero, hasSaveGame);
uiAddHeroInfo(&uihero);
}
CloseArchive(&archive);
@ -385,10 +388,12 @@ void pfile_read_player_from_save(uint32_t saveNum, int playerId)
CloseArchive(&archive);
auto &player = Players[playerId];
UnPackPlayer(&pkplr, playerId, false);
LoadHeroItems(Players[playerId]);
RemoveEmptyInventory(Players[playerId]);
LoadHeroItems(player);
RemoveEmptyInventory(player);
CalcPlrInv(playerId, false);
}

5
Source/plrmsg.cpp

@ -83,9 +83,10 @@ void SendPlrMsg(int pnum, const char *pszStr)
plr_msg_slot = (plr_msg_slot + 1) & (PMSG_COUNT - 1);
pMsg->player = pnum;
pMsg->time = SDL_GetTicks();
assert(strlen(Players[pnum]._pName) < PLR_NAME_LEN);
auto &player = Players[pnum];
assert(strlen(player._pName) < PLR_NAME_LEN);
assert(strlen(pszStr) < MAX_SEND_STR_LEN);
strcpy(pMsg->str, fmt::format(_(/* TRANSLATORS: Shown if player presses "v" button. {:s} is player name, {:d} is level, {:s} is location */ "{:s} (lvl {:d}): {:s}"), Players[pnum]._pName, Players[pnum]._pLevel, pszStr).c_str());
strcpy(pMsg->str, fmt::format(_(/* TRANSLATORS: Shown if player presses "v" button. {:s} is player name, {:d} is level, {:s} is location */ "{:s} (lvl {:d}): {:s}"), player._pName, player._pLevel, pszStr).c_str());
}
void ClearPlrMsg()

16
Source/quests.cpp

@ -313,23 +313,25 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg)
if (gbIsSpawn)
return;
auto &myPlayer = Players[MyPlayerId];
if (monster.MType->mtype == MT_SKING) {
Quests[Q_SKELKING]._qactive = QUEST_DONE;
Players[MyPlayerId].Say(HeroSpeech::RestWellLeoricIllFindYourSon, 30);
myPlayer.Say(HeroSpeech::RestWellLeoricIllFindYourSon, 30);
if (sendmsg)
NetSendCmdQuest(true, Q_SKELKING);
} else if (monster.MType->mtype == MT_CLEAVER) {
Quests[Q_BUTCHER]._qactive = QUEST_DONE;
Players[MyPlayerId].Say(HeroSpeech::TheSpiritsOfTheDeadAreNowAvenged, 30);
myPlayer.Say(HeroSpeech::TheSpiritsOfTheDeadAreNowAvenged, 30);
if (sendmsg)
NetSendCmdQuest(true, Q_BUTCHER);
} else if (monster._uniqtype - 1 == UMT_GARBUD) { //"Gharbad the Weak"
Quests[Q_GARBUD]._qactive = QUEST_DONE;
Players[MyPlayerId].Say(HeroSpeech::ImNotImpressed, 30);
myPlayer.Say(HeroSpeech::ImNotImpressed, 30);
} else if (monster._uniqtype - 1 == UMT_ZHAR) { //"Zhar the Mad"
Quests[Q_ZHAR]._qactive = QUEST_DONE;
Players[MyPlayerId].Say(HeroSpeech::ImSorryDidIBreakYourConcentration, 30);
myPlayer.Say(HeroSpeech::ImSorryDidIBreakYourConcentration, 30);
} else if (monster._uniqtype - 1 == UMT_LAZARUS && gbIsMultiplayer) { //"Arch-Bishop Lazarus"
Quests[Q_BETRAYER]._qactive = QUEST_DONE;
Quests[Q_BETRAYER]._qvar1 = 7;
@ -344,7 +346,7 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg)
}
}
}
Players[MyPlayerId].Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30);
myPlayer.Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30);
if (sendmsg) {
NetSendCmdQuest(true, Q_BETRAYER);
NetSendCmdQuest(true, Q_DIABLO);
@ -356,10 +358,10 @@ void CheckQuestKill(const MonsterStruct &monster, bool sendmsg)
Quests[Q_BETRAYER]._qvar2 = 4;
Quests[Q_DIABLO]._qactive = QUEST_ACTIVE;
AddMissile({ 35, 32 }, { 35, 32 }, 0, MIS_RPORTAL, TARGET_MONSTERS, MyPlayerId, 0, 0);
Players[MyPlayerId].Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30);
myPlayer.Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30);
} else if (monster._uniqtype - 1 == UMT_WARLORD) { //"Warlord of Blood"
Quests[Q_WARLORD]._qactive = QUEST_DONE;
Players[MyPlayerId].Say(HeroSpeech::YourReignOfPainHasEnded, 30);
myPlayer.Say(HeroSpeech::YourReignOfPainHasEnded, 30);
}
}

5
Source/scrollrt.cpp

@ -485,9 +485,10 @@ static void DrawPlayerIconHelper(const Surface &out, int pnum, missile_graphic_i
*/
static void DrawPlayerIcons(const Surface &out, int pnum, int x, int y, bool lighting)
{
if (Players[pnum].pManaShield)
auto &player = Players[pnum];
if (player.pManaShield)
DrawPlayerIconHelper(out, pnum, MFILE_MANASHLD, x, y, lighting);
if (Players[pnum].wReflections > 0)
if (player.wReflections > 0)
DrawPlayerIconHelper(out, pnum, MFILE_REFLECT, x, y + 16, lighting);
}

45
Source/spells.cpp

@ -68,30 +68,31 @@ void UseMana(int id, spell_id sn)
{
int ma; // mana cost
if (id == MyPlayerId) {
switch (Players[id]._pSplType) {
case RSPLTYPE_SKILL:
case RSPLTYPE_INVALID:
break;
case RSPLTYPE_SCROLL:
RemoveScroll(Players[id]);
break;
case RSPLTYPE_CHARGES:
UseStaffCharge(Players[id]);
break;
case RSPLTYPE_SPELL:
#ifdef _DEBUG
if (!debug_mode_key_inverted_v) {
#endif
ma = GetManaAmount(Players[id], sn);
Players[id]._pMana -= ma;
Players[id]._pManaBase -= ma;
drawmanaflag = true;
if (id != MyPlayerId)
return;
auto &myPlayer = Players[MyPlayerId];
switch (myPlayer._pSplType) {
case RSPLTYPE_SKILL:
case RSPLTYPE_INVALID:
break;
case RSPLTYPE_SCROLL:
RemoveScroll(myPlayer);
break;
case RSPLTYPE_CHARGES:
UseStaffCharge(myPlayer);
break;
case RSPLTYPE_SPELL:
#ifdef _DEBUG
}
#endif
if (debug_mode_key_inverted_v)
break;
}
#endif
ma = GetManaAmount(myPlayer, sn);
myPlayer._pMana -= ma;
myPlayer._pManaBase -= ma;
drawmanaflag = true;
break;
}
}

2
Source/tmsg.cpp

@ -5,8 +5,8 @@
*/
#include <list>
#include "tmsg.h"
#include "diablo.h"
#include "tmsg.h"
namespace devilution {

7
Source/town.cpp

@ -168,14 +168,15 @@ void DrlgTPass3()
FillSector("Levels\\TownData\\Sector4s.DUN", 0, 0);
if (gbIsSpawn || !gbIsMultiplayer) {
if (gbIsSpawn || ((Players[MyPlayerId].pTownWarps & 1) == 0 && (!gbIsHellfire || Players[MyPlayerId]._pLevel < 10))) {
auto &myPlayer = Players[MyPlayerId];
if (gbIsSpawn || ((myPlayer.pTownWarps & 1) == 0 && (!gbIsHellfire || myPlayer._pLevel < 10))) {
FillTile(48, 20, 320);
}
if (gbIsSpawn || ((Players[MyPlayerId].pTownWarps & 2) == 0 && (!gbIsHellfire || Players[MyPlayerId]._pLevel < 15))) {
if (gbIsSpawn || ((myPlayer.pTownWarps & 2) == 0 && (!gbIsHellfire || myPlayer._pLevel < 15))) {
FillTile(16, 68, 332);
FillTile(16, 70, 331);
}
if (gbIsSpawn || ((Players[MyPlayerId].pTownWarps & 4) == 0 && (!gbIsHellfire || Players[MyPlayerId]._pLevel < 20))) {
if (gbIsSpawn || ((myPlayer.pTownWarps & 4) == 0 && (!gbIsHellfire || myPlayer._pLevel < 20))) {
for (int x = 36; x < 46; x++) {
FillTile(x, 78, GenerateRnd(4) + 1);
}

Loading…
Cancel
Save