diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index b449473c8..8290d65a9 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -303,7 +303,7 @@ void FindMeleeTarget() void CheckMonstersNearby() { - if (Players[MyPlayerId]._pwtype == WT_RANGED || HasRangedSpell()) { + if (Players[MyPlayerId].UsesRangedWeapon() || HasRangedSpell()) { FindRangedTarget(); return; } @@ -337,7 +337,7 @@ void CheckPlayerNearby() || (player._pHitPoints == 0 && spl != SPL_RESURRECT)) continue; - if (myPlayer._pwtype == WT_RANGED || HasRangedSpell() || spl == SPL_HEALOTHER) { + if (myPlayer.UsesRangedWeapon() || HasRangedSpell() || spl == SPL_HEALOTHER) { newDdistance = GetDistanceRanged(player.position.future); } else { newDdistance = GetDistance(player.position.future, distance); @@ -440,13 +440,13 @@ void Interact() if (leveltype == DTYPE_TOWN && pcursmonst != -1) { NetSendCmdLocParam1(true, CMD_TALKXY, Towners[pcursmonst].position, pcursmonst); } else if (pcursmonst != -1) { - if (Players[MyPlayerId]._pwtype != WT_RANGED || CanTalkToMonst(Monsters[pcursmonst])) { + if (!Players[MyPlayerId].UsesRangedWeapon() || CanTalkToMonst(Monsters[pcursmonst])) { NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); } else { NetSendCmdParam1(true, CMD_RATTACKID, pcursmonst); } } else if (leveltype != DTYPE_TOWN && pcursplr != -1 && !gbFriendlyMode) { - NetSendCmdParam1(true, Players[MyPlayerId]._pwtype == WT_RANGED ? CMD_RATTACKPID : CMD_ATTACKPID, pcursplr); + NetSendCmdParam1(true, Players[MyPlayerId].UsesRangedWeapon() ? CMD_RATTACKPID : CMD_ATTACKPID, pcursplr); } } diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 5794d5ee5..57d14602f 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -252,7 +252,7 @@ bool LeftMouseCmd(bool bShift) NetSendCmdLocParam1(true, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, { cursmx, cursmy }, pcursitem); } else if (pcursobj != -1 && (!objectIsDisabled(pcursobj)) && (!bShift || (bNear && Objects[pcursobj]._oBreak == 1))) { NetSendCmdLocParam1(true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, { cursmx, cursmy }, pcursobj); - } else if (myPlayer._pwtype == WT_RANGED) { + } else if (myPlayer.UsesRangedWeapon()) { if (bShift) { lastLeftMouseButtonAction = MouseActionType::Attack; NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, { cursmx, cursmy }); diff --git a/Source/items.cpp b/Source/items.cpp index cbe27a55a..3632efc60 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -2880,7 +2880,6 @@ void CalcPlrItemVals(int playerId, bool loadgfx) if (player.InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON && player.InvBody[INVLOC_HAND_RIGHT]._iLoc != ILOC_TWOHAND && player.InvBody[INVLOC_HAND_LEFT].isEmpty()) player._pBlockFlag = true; } - player._pwtype = WT_MELEE; item_type weaponItemType = item_type::ITYPE_NONE; bool holdsShield = false; @@ -2914,7 +2913,6 @@ void CalcPlrItemVals(int playerId, bool loadgfx) animWeaponId = PlayerWeaponGraphic::Axe; break; case ITYPE_BOW: - player._pwtype = WT_RANGED; animWeaponId = PlayerWeaponGraphic::Bow; break; case ITYPE_MACE: diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index a5f379f72..5c290b79b 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -374,7 +374,7 @@ void LoadPlayer(LoadHelper *file, int p) for (auto &spellType : player._pSplTHotKey) spellType = static_cast(file->NextLE()); - player._pwtype = static_cast(file->NextLE()); + file->Skip(); // Skip _pwtype player._pBlockFlag = file->NextBool8(); player._pInvincible = file->NextBool8(); player._pLightRad = file->NextLE(); @@ -1047,7 +1047,7 @@ void SavePlayer(SaveHelper *file, int p) for (auto &spellType : player._pSplTHotKey) file->WriteLE(spellType); - file->WriteLE(player._pwtype); + file->WriteLE(player.UsesRangedWeapon() ? 1 : 0); file->WriteLE(player._pBlockFlag ? 1 : 0); file->WriteLE(player._pInvincible ? 1 : 0); file->WriteLE(player._pLightRad); diff --git a/Source/player.cpp b/Source/player.cpp index d788532fb..ad23a76c6 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -1191,11 +1191,6 @@ void InitPlayer(int pnum, bool firstTime) player._pSBkSpell = SPL_INVALID; player._pSpell = player._pRSpell; player._pSplType = player._pRSplType; - if (static_cast((player._pgfxnum & 0xF)) == PlayerWeaponGraphic::Bow) { - player._pwtype = WT_RANGED; - } else { - player._pwtype = WT_MELEE; - } player.pManaShield = false; } diff --git a/Source/player.h b/Source/player.h index 6343a9711..7c7ecdd68 100644 --- a/Source/player.h +++ b/Source/player.h @@ -144,11 +144,6 @@ enum action_id : int8_t { // clang-format on }; -enum player_weapon_type : uint8_t { - WT_MELEE, - WT_RANGED, -}; - /** * @brief Contains Data (CelSprites) for a player graphic (player_graphic) */ @@ -201,7 +196,6 @@ struct PlayerStruct { uint8_t _pSpellFlags; spell_id _pSplHotKey[4]; spell_type _pSplTHotKey[4]; - player_weapon_type _pwtype; bool _pBlockFlag; bool _pInvincible; int8_t _pLightRad; @@ -432,6 +426,14 @@ struct PlayerStruct { return _pManaPer; } + + /** + * @brief Does the player currently have a ranged weapon equipped? + */ + bool UsesRangedWeapon() const + { + return static_cast(_pgfxnum & 0xF) == PlayerWeaponGraphic::Bow; + }; }; extern int MyPlayerId; diff --git a/Source/track.cpp b/Source/track.cpp index 792accb39..430e464ad 100644 --- a/Source/track.cpp +++ b/Source/track.cpp @@ -44,7 +44,7 @@ static bool RepeatMouseAttack(bool leftButton) return false; if (Players[MyPlayerId]._pmode != PM_DEATH && Players[MyPlayerId]._pmode != PM_QUIT && Players[MyPlayerId].destAction == ACTION_NONE && SDL_GetTicks() - *timePressed >= (Uint32)gnTickDelay * 4) { - bool rangedAttack = Players[MyPlayerId]._pwtype == WT_RANGED; + bool rangedAttack = Players[MyPlayerId].UsesRangedWeapon(); *timePressed = SDL_GetTicks(); switch (lastAction) { case MouseActionType::Attack: diff --git a/test/writehero_test.cpp b/test/writehero_test.cpp index a648ec5db..f017af5a3 100644 --- a/test/writehero_test.cpp +++ b/test/writehero_test.cpp @@ -306,7 +306,7 @@ static void AssertPlayer(PlayerStruct &player) ASSERT_EQ(player._pAblSpells, 134217728); ASSERT_EQ(player._pScrlSpells, 0); ASSERT_EQ(player._pSpellFlags, 0); - ASSERT_EQ(player._pwtype, 1); + ASSERT_TRUE(player.UsesRangedWeapon()); ASSERT_EQ(player._pBlockFlag, 0); ASSERT_EQ(player._pLightRad, 11); ASSERT_EQ(player._pDamageMod, 101);