Browse Source

add enum for the spell flags. Adjust code to use them.

pull/4127/head
DakkJaniels 4 years ago committed by GitHub
parent
commit
7bc19ee91a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      Source/items.cpp
  2. 4
      Source/loadsave.cpp
  3. 24
      Source/missiles.cpp
  4. 2
      Source/monster.cpp
  5. 4
      Source/player.cpp
  6. 13
      Source/player.h
  7. 2
      test/player_test.cpp
  8. 2
      test/writehero_test.cpp

6
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;

4
Source/loadsave.cpp

@ -362,7 +362,7 @@ void LoadPlayer(LoadHelper &file, Player &player)
player._pMemSpells = file.NextLE<uint64_t>();
player._pAblSpells = file.NextLE<uint64_t>();
player._pScrlSpells = file.NextLE<uint64_t>();
player._pSpellFlags = file.NextLE<uint8_t>();
player._pSpellFlags = static_cast<SpellFlag>(file.NextLE<uint8_t>());
file.Skip(3); // Alignment
for (auto &spell : player._pSplHotKey)
@ -1083,7 +1083,7 @@ void SavePlayer(SaveHelper &file, const Player &player)
file.WriteLE<uint64_t>(player._pMemSpells);
file.WriteLE<uint64_t>(player._pAblSpells);
file.WriteLE<uint64_t>(player._pScrlSpells);
file.WriteLE<uint8_t>(player._pSpellFlags);
file.WriteLE<uint8_t>(static_cast<uint8_t>(player._pSpellFlags));
file.Skip(3); // Alignment
for (auto &spellId : player._pSplHotKey)

24
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;
}

2
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;

4
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;

13
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<char, 4> 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;

2
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);

2
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);

Loading…
Cancel
Save