Browse Source

Update CheckReflect to return applied damage

Instead of modifying the damage value by reference
pull/5640/head
ephphatha 3 years ago committed by Anders Jenbo
parent
commit
9da76e0003
  1. 24
      Source/engine/random.hpp
  2. 13
      Source/monster.cpp

24
Source/engine/random.hpp

@ -84,4 +84,28 @@ const T PickRandomlyAmong(const std::initializer_list<T> &values)
return *(values.begin() + index);
}
/**
* @brief Generates a random non-negative integer
*
* Effectively the same as GenerateRnd but will never return a negative value
* @param v upper limit for the return value
* @return a value between 0 and v-1 inclusive, i.e. the range [0, v)
*/
inline int32_t RandomIntLessThan(int32_t v)
{
return std::max<int32_t>(GenerateRnd(v), 0);
}
/**
* @brief Randomly chooses a value somewhere within the given range
* @param min lower limit, minumum possible value
* @param max upper limit, either the maximum possible value for a closed range (the default behaviour) or one greater than the maximum value for a half-open range
* @param halfOpen whether to use the limits as a half-open range or not
* @return a randomly selected integer
*/
inline int32_t RandomIntBetween(int32_t min, int32_t max, bool halfOpen = false)
{
return RandomIntLessThan(max - min + (halfOpen ? 0 : 1)) + min;
}
} // namespace devilution

13
Source/monster.cpp

@ -1106,19 +1106,20 @@ void MonsterAttackMonster(Monster &attacker, Monster &target, int hper, int mind
}
}
void CheckReflect(Monster &monster, Player &player, int &dam)
int CheckReflect(Monster &monster, Player &player, int dam)
{
player.wReflections--;
if (player.wReflections <= 0)
NetSendCmdParam1(true, CMD_SETREFLECT, 0);
// reflects 20-30% damage
int mdam = dam * (GenerateRnd(10) + 20L) / 100;
int mdam = dam * RandomIntBetween(20, 30, true) / 100;
ApplyMonsterDamage(monster, mdam);
dam = std::max(dam - mdam, 0);
if (monster.hitPoints >> 6 <= 0)
M_StartKill(monster, player);
else
M_StartHit(monster, player, mdam);
return mdam;
}
int GetMinHit()
@ -1192,8 +1193,10 @@ void MonsterAttackPlayer(Monster &monster, Player &player, int hit, int minDam,
int dam = (minDam << 6) + GenerateRnd(((maxDam - minDam) << 6) + 1);
dam = std::max(dam + (player._pIGetHit << 6), 64);
if (&player == MyPlayer) {
if (player.wReflections > 0)
CheckReflect(monster, player, dam);
if (player.wReflections > 0) {
int reflectedDamage = CheckReflect(monster, player, dam);
dam = std::max(dam - reflectedDamage, 0);
}
ApplyPlrDamage(player, 0, 0, dam);
}

Loading…
Cancel
Save