From d76158ca032f307cfe1aece51e69d64b6bf3c5a3 Mon Sep 17 00:00:00 2001 From: qndel Date: Sun, 22 Aug 2021 01:32:41 +0200 Subject: [PATCH] reflect without missile! (#2659) --- Source/misdat.cpp | 2 +- Source/missiles.cpp | 42 ++++++++++++------------------------------ Source/missiles.h | 1 - Source/msg.cpp | 23 ++++------------------- Source/msg.h | 2 -- Source/player.cpp | 8 ++++++-- 6 files changed, 23 insertions(+), 55 deletions(-) diff --git a/Source/misdat.cpp b/Source/misdat.cpp index c0e9cb076..06767fa6e 100644 --- a/Source/misdat.cpp +++ b/Source/misdat.cpp @@ -94,7 +94,7 @@ MissileDataStruct MissileData[] = { { &AddCboltArrow, &MI_Cbolt, MIS_CBOLTARROW, true, 1, MISR_LIGHTNING, MFILE_MINILTNG, LS_CBOLT, SFX_NONE, MissileMovementDistrubution::Blockable }, { &AddHbolt, &MI_Hbolt, MIS_HBOLTARROW, true, 1, MISR_NONE, MFILE_HOLY, LS_HOLYBOLT, LS_ELECIMP1, MissileMovementDistrubution::Blockable }, { &AddWarp, &MI_Teleport, MIS_WARP, false, 1, MISR_NONE, MFILE_NONE, LS_ETHEREAL, SFX_NONE, MissileMovementDistrubution::Disabled }, - { &AddReflection, &MI_Reflect, MIS_REFLECT, false, 1, MISR_NONE, MFILE_REFLECT, LS_MSHIELD, SFX_NONE, MissileMovementDistrubution::Disabled }, + { &AddReflection, nullptr, MIS_REFLECT, false, 1, MISR_NONE, MFILE_REFLECT, LS_MSHIELD, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddBerserk, nullptr, MIS_BERSERK, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddRing, &MI_FireRing, MIS_FIRERING, false, 1, MISR_FIRE, MFILE_FIREWAL, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, { &AddStealPotions, nullptr, MIS_STEALPOTS, false, 1, MISR_NONE, MFILE_NONE, SFX_NONE, SFX_NONE, MissileMovementDistrubution::Disabled }, diff --git a/Source/missiles.cpp b/Source/missiles.cpp index b74844371..2de2c202f 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -950,11 +950,6 @@ void DeleteMissile(int mi, int i) if (src == MyPlayerId) NetSendCmd(true, CMD_REMSHIELD); Players[src].pManaShield = false; - } else if (missile._mitype == MIS_REFLECT) { - int src = missile._misource; - if (src == MyPlayerId) - NetSendCmd(true, CMD_REMREFLECT); - Players[src].wReflections = 0; } AvailableMissiles[MAXMISSILES - ActiveMissileCount] = mi; @@ -1349,17 +1344,20 @@ void AddStoneRune(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy* void AddReflection(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/) { auto &missile = Missiles[mi]; - if (id >= 0) { - auto &player = Players[id]; - player.wReflections += (missile._mispllvl != 0 ? missile._mispllvl : 2) * player._pLevel; - if (id == MyPlayerId) - NetSendCmdParam1(true, CMD_SETREFLECT, player.wReflections); + missile._miDelFlag = true; - UseMana(id, SPL_REFLECT); - } + if (id < 0) + return; - missile._mirange = 0; - missile._miDelFlag = false; + auto &player = Players[id]; + int add = (missile._mispllvl != 0 ? missile._mispllvl : 2) * player._pLevel; + if (player.wReflections + add >= std::numeric_limits::max()) + add = 0; + player.wReflections += add; + if (id == MyPlayerId) + NetSendCmdParam1(true, CMD_SETREFLECT, player.wReflections); + + UseMana(id, SPL_REFLECT); } void AddBerserk(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/) @@ -3483,22 +3481,6 @@ void MI_LightningArrow(int i) } } -void MI_Reflect(int i) -{ - auto &missile = Missiles[i]; - int id = missile._misource; - if (id != MyPlayerId) { - if (currlevel != Players[id].plrlevel) - missile._miDelFlag = true; - } else { - if (Players[id].wReflections <= 0 || !Players[id].plractive) { - missile._miDelFlag = true; - NetSendCmd(true, CMD_ENDREFLECT); - } - } - PutMissile(i); -} - void MI_FireRing(int i) { auto &missile = Missiles[i]; diff --git a/Source/missiles.h b/Source/missiles.h index 243d1fb6a..d1ed8ac4b 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -232,7 +232,6 @@ void MI_Rune(int i); void MI_LightningWall(int i); void MI_HiveExplode(int i); void MI_LightningArrow(int i); -void MI_Reflect(int i); void MI_FireRing(int i); void MI_Search(int i); void MI_LightningWallC(int i); diff --git a/Source/msg.cpp b/Source/msg.cpp index a0cec1745..0aedd6cc8 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1777,25 +1777,14 @@ DWORD OnEndShield(TCmd *pCmd, int pnum) DWORD OnSetReflect(TCmd *pCmd, PlayerStruct &player) { auto *p = (TCmdParam1 *)pCmd; - if (gbBufferMsgs != 1) - player.wReflections = p->wParam1; + if (gbBufferMsgs != 1) { + if (currlevel == player.plrlevel) + player.wReflections = p->wParam1; + } return sizeof(*p); } -DWORD OnRemoveReflect(TCmd *pCmd, PlayerStruct &player) -{ - if (gbBufferMsgs != 1) - player.wReflections = 0; - - return sizeof(*pCmd); -} - -DWORD OnEndReflect(TCmd *pCmd, int pnum) -{ - return EndEffect(pCmd, pnum, MIS_REFLECT); -} - DWORD OnNakrul(TCmd *pCmd) { if (gbBufferMsgs != 1) { @@ -2688,10 +2677,6 @@ DWORD ParseCmd(int pnum, TCmd *pCmd) return OnEndShield(pCmd, pnum); case CMD_SETREFLECT: return OnSetReflect(pCmd, player); - case CMD_REMREFLECT: - return OnRemoveReflect(pCmd, player); - case CMD_ENDREFLECT: - return OnEndReflect(pCmd, pnum); case CMD_NAKRUL: return OnNakrul(pCmd); case CMD_OPENHIVE: diff --git a/Source/msg.h b/Source/msg.h index caf718781..0335d5de8 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -122,8 +122,6 @@ enum _cmd_id : uint8_t { CMD_REMSHIELD, CMD_ENDSHIELD, CMD_SETREFLECT, - CMD_REMREFLECT, - CMD_ENDREFLECT, CMD_NAKRUL, CMD_OPENHIVE, CMD_OPENCRYPT, diff --git a/Source/player.cpp b/Source/player.cpp index a4aa83ec2..dbbae4f6f 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -664,8 +664,13 @@ void DropHalfPlayersGold(int pnum) void InitLevelChange(int pnum) { auto &player = Players[pnum]; + auto &myPlayer = Players[MyPlayerId]; RemovePlrMissiles(pnum); + player.wReflections = 0; + // share info about your reflect charges when another player joins the level + if (pnum != MyPlayerId) + NetSendCmdParam1(true, CMD_SETREFLECT, myPlayer.wReflections); if (pnum == MyPlayerId && qtextflag) { qtextflag = false; stream_stop(); @@ -674,7 +679,6 @@ void InitLevelChange(int pnum) RemovePlrFromMap(pnum); SetPlayerOld(player); if (pnum == MyPlayerId) { - auto &myPlayer = Players[MyPlayerId]; dPlayer[myPlayer.position.tile.x][myPlayer.position.tile.y] = MyPlayerId + 1; } else { player._pLvlVisited[player.plrlevel] = true; @@ -3221,7 +3225,7 @@ void RemovePlrMissiles(int pnum) if (missile._mitype == MIS_STONE && missile._misource == pnum) { Monsters[missile._miVar2]._mmode = (MON_MODE)missile._miVar1; } - if (IsAnyOf(missile._mitype, MIS_MANASHIELD, MIS_REFLECT) && missile._misource == pnum) { + if (missile._mitype == MIS_MANASHIELD && missile._misource == pnum) { ClearMissileSpot(missile); DeleteMissile(am, i); }