From 7bc19ee91a290397fedb35a9142a49e4537c91a8 Mon Sep 17 00:00:00 2001 From: DakkJaniels <6080734+DakkJaniels@users.noreply.github.com> Date: Sat, 5 Mar 2022 20:09:19 -0500 Subject: [PATCH] add enum for the spell flags. Adjust code to use them. --- Source/items.cpp | 6 +++--- Source/loadsave.cpp | 4 ++-- Source/missiles.cpp | 24 ++++++++++++------------ Source/monster.cpp | 2 +- Source/player.cpp | 4 ++-- Source/player.h | 13 ++++++++++++- test/player_test.cpp | 2 +- test/writehero_test.cpp | 2 +- 8 files changed, 34 insertions(+), 23 deletions(-) diff --git a/Source/items.cpp b/Source/items.cpp index fbee3e264..5f0f44be5 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -2644,12 +2644,12 @@ void CalcPlrItemVals(Player &player, bool loadgfx) } } - if ((player._pSpellFlags & 2) == 2) { + if (HasAnyOf(player._pSpellFlags, SpellFlag::RageActive)) { sadd += 2 * player._pLevel; dadd += player._pLevel + player._pLevel / 2; vadd += 2 * player._pLevel; } - if ((player._pSpellFlags & 4) == 4) { + if (HasAnyOf(player._pSpellFlags, SpellFlag::RageCooldown)) { sadd -= 2 * player._pLevel; dadd -= player._pLevel + player._pLevel / 2; vadd -= 2 * player._pLevel; @@ -2737,7 +2737,7 @@ void CalcPlrItemVals(Player &player, bool loadgfx) lr += player._pLevel; } - if ((player._pSpellFlags & 4) == 4) { + if (HasAnyOf(player._pSpellFlags, SpellFlag::RageCooldown)) { mr -= player._pLevel; fr -= player._pLevel; lr -= player._pLevel; diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 45c62a54f..cb4383149 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -362,7 +362,7 @@ void LoadPlayer(LoadHelper &file, Player &player) player._pMemSpells = file.NextLE(); player._pAblSpells = file.NextLE(); player._pScrlSpells = file.NextLE(); - player._pSpellFlags = file.NextLE(); + player._pSpellFlags = static_cast(file.NextLE()); file.Skip(3); // Alignment for (auto &spell : player._pSplHotKey) @@ -1083,7 +1083,7 @@ void SavePlayer(SaveHelper &file, const Player &player) file.WriteLE(player._pMemSpells); file.WriteLE(player._pAblSpells); file.WriteLE(player._pScrlSpells); - file.WriteLE(player._pSpellFlags); + file.WriteLE(static_cast(player._pSpellFlags)); file.Skip(3); // Alignment for (auto &spellId : player._pSplHotKey) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index adf8e1ffc..7a48eb0e6 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -325,7 +325,7 @@ bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, missile_id m return false; } - if ((target._pSpellFlags & 1) != 0 && MissilesData[mtype].mType == 0) { + if (HasAnyOf(target._pSpellFlags, SpellFlag::Etherealize) && MissilesData[mtype].mType == 0) { return false; } @@ -1044,7 +1044,7 @@ bool PlayerMHit(int pnum, Monster *monster, int dist, int mind, int maxd, missil return false; } - if ((player._pSpellFlags & 1) != 0 && MissilesData[mtype].mType == 0) { + if (HasAnyOf(player._pSpellFlags, SpellFlag::Etherealize) && MissilesData[mtype].mType == 0) { return false; } @@ -1178,7 +1178,7 @@ void InitMissiles() auto &myPlayer = Players[MyPlayerId]; AutoMapShowItems = false; - myPlayer._pSpellFlags &= ~0x1; + myPlayer._pSpellFlags &= ~SpellFlag::Etherealize; if (myPlayer._pInfraFlag) { for (auto &missile : Missiles) { if (missile._mitype == MIS_INFRA) { @@ -1189,9 +1189,9 @@ void InitMissiles() } } - if ((myPlayer._pSpellFlags & 2) == 2 || (myPlayer._pSpellFlags & 4) == 4) { - myPlayer._pSpellFlags &= ~0x2; - myPlayer._pSpellFlags &= ~0x4; + if (HasAnyOf(myPlayer._pSpellFlags, SpellFlag::RageActive | SpellFlag::RageCooldown)) { + myPlayer._pSpellFlags &= ~SpellFlag::RageActive; + myPlayer._pSpellFlags &= ~SpellFlag::RageCooldown; for (auto &missile : Missiles) { if (missile._mitype == MIS_BLODBOIL) { if (missile._misource == MyPlayerId) { @@ -2475,7 +2475,7 @@ void AddBlodboil(Missile &missile, const AddMissileParameter & /*parameter*/) { auto &player = Players[missile._misource]; - if ((player._pSpellFlags & 6) != 0 || player._pHitPoints <= player._pLevel << 6) { + if (HasAnyOf(player._pSpellFlags, SpellFlag::RageActive | SpellFlag::RageCooldown) || player._pHitPoints <= player._pLevel << 6) { missile._miDelFlag = true; return; } @@ -2483,7 +2483,7 @@ void AddBlodboil(Missile &missile, const AddMissileParameter & /*parameter*/) UseMana(missile._misource, SPL_BLODBOIL); int tmp = 3 * player._pLevel; tmp <<= 7; - player._pSpellFlags |= 2; + player._pSpellFlags |= SpellFlag::RageActive; missile.var2 = tmp; int lvl = player._pLevel * 2; missile._mirange = lvl + 10 * missile._mispllvl + 245; @@ -3846,13 +3846,13 @@ void MI_Blodboil(Missile &missile) int hpdif = player._pMaxHP - player._pHitPoints; - if ((player._pSpellFlags & 2) != 0) { - player._pSpellFlags &= ~0x2; - player._pSpellFlags |= 4; + if (HasAnyOf(player._pSpellFlags, SpellFlag::RageActive)) { + player._pSpellFlags &= ~SpellFlag::RageActive; + player._pSpellFlags |= SpellFlag::RageCooldown; int lvl = player._pLevel * 2; missile._mirange = lvl + 10 * missile._mispllvl + 245; } else { - player._pSpellFlags &= ~0x4; + player._pSpellFlags &= ~SpellFlag::RageCooldown; missile._miDelFlag = true; hpdif += missile.var2; } diff --git a/Source/monster.cpp b/Source/monster.cpp index dfbb8bb07..f94f572b3 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1340,7 +1340,7 @@ void MonsterAttackPlayer(int i, int pnum, int hit, int minDam, int maxDam) auto &player = Players[pnum]; - if (player._pHitPoints >> 6 <= 0 || player._pInvincible || (player._pSpellFlags & 1) != 0) + if (player._pHitPoints >> 6 <= 0 || player._pInvincible || HasAnyOf(player._pSpellFlags, SpellFlag::Etherealize)) return; if (monster.position.tile.WalkingDistance(player.position.tile) >= 2) return; diff --git a/Source/player.cpp b/Source/player.cpp index c458efbd9..97088a324 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -1047,7 +1047,7 @@ bool PlrHitPlr(int pnum, int8_t p) return false; } - if ((target._pSpellFlags & 1) != 0) { + if (HasAnyOf(target._pSpellFlags, SpellFlag::Etherealize)) { return false; } @@ -2640,7 +2640,7 @@ void CreatePlayer(int playerId, HeroClass c) spellLevel = 0; } - player._pSpellFlags = 0; + player._pSpellFlags = SpellFlag::None; if (player._pClass == HeroClass::Sorcerer) { player._pSplLvl[SPL_FIREBOLT] = 2; diff --git a/Source/player.h b/Source/player.h index 7a2a8de19..204fb6b48 100644 --- a/Source/player.h +++ b/Source/player.h @@ -147,6 +147,17 @@ enum action_id : int8_t { // clang-format on }; +enum class SpellFlag : uint8_t { + // clang-format off + None = 0, + Etherealize = 1 << 0, + RageActive = 1 << 1, + RageCooldown = 1 << 2, + // bits 3-7 are unused + // clang-format on +}; +use_enum_as_flags(SpellFlag); + /** Maps from armor animation to letter used in graphic files. */ constexpr std::array ArmourChar = { 'L', // light @@ -238,7 +249,7 @@ struct Player { uint64_t _pMemSpells; // Bitmask of learned spells uint64_t _pAblSpells; // Bitmask of abilities uint64_t _pScrlSpells; // Bitmask of spells available via scrolls - uint8_t _pSpellFlags; + SpellFlag _pSpellFlags; spell_id _pSplHotKey[4]; spell_type _pSplTHotKey[4]; bool _pBlockFlag; diff --git a/test/player_test.cpp b/test/player_test.cpp index e0e003419..dc6e573ba 100644 --- a/test/player_test.cpp +++ b/test/player_test.cpp @@ -139,7 +139,7 @@ static void AssertPlayer(Player &player) ASSERT_EQ(player._pSBkSpell, 0); ASSERT_EQ(player._pAblSpells, 134217728); ASSERT_EQ(player._pScrlSpells, 0); - ASSERT_EQ(player._pSpellFlags, 0); + ASSERT_EQ(player._pSpellFlags, SpellFlag::None); ASSERT_EQ(player._pBlockFlag, 0); ASSERT_EQ(player._pLightRad, 10); ASSERT_EQ(player._pDamageMod, 0); diff --git a/test/writehero_test.cpp b/test/writehero_test.cpp index caeaef70e..042990206 100644 --- a/test/writehero_test.cpp +++ b/test/writehero_test.cpp @@ -277,7 +277,7 @@ static void AssertPlayer(Player &player) ASSERT_EQ(player._pSBkSpell, -1); ASSERT_EQ(player._pAblSpells, 134217728); ASSERT_EQ(player._pScrlSpells, 0); - ASSERT_EQ(player._pSpellFlags, 0); + ASSERT_EQ(player._pSpellFlags, SpellFlag::None); ASSERT_TRUE(player.UsesRangedWeapon()); ASSERT_EQ(player._pBlockFlag, 0); ASSERT_EQ(player._pLightRad, 11);