Browse Source

Bugfix/Refactor: Min-Max Damage Range Calculations (#7022)

pull/7138/head
Eric Robinson 2 years ago committed by GitHub
parent
commit
109c3b165c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 17
      Source/missiles.cpp
  2. 9
      Source/monster.cpp
  3. 6
      Source/player.cpp

17
Source/missiles.cpp

@ -195,7 +195,7 @@ void MoveMissilePos(Missile &missile)
int ProjectileMonsterDamage(Missile &missile)
{
const Monster &monster = *missile.sourceMonster();
return monster.minDamage + GenerateRnd(monster.maxDamage - monster.minDamage + 1);
return RandomIntBetween(monster.minDamage, monster.maxDamage);
}
int ProjectileTrapDamage()
@ -240,7 +240,7 @@ bool MonsterMHit(const Player &player, int monsterId, int mindam, int maxdam, in
if (t == MissileID::BoneSpirit) {
dam = monster.hitPoints / 3 >> 6;
} else {
dam = mindam + GenerateRnd(maxdam - mindam + 1);
dam = RandomIntBetween(mindam, maxdam);
}
if (missileData.isArrow() && damageType == DamageType::Physical) {
@ -353,7 +353,7 @@ bool Plr2PlrMHit(const Player &player, Player &target, int mindam, int maxdam, i
if (mtype == MissileID::BoneSpirit) {
dam = target._pHitPoints / 3;
} else {
dam = mindam + GenerateRnd(maxdam - mindam + 1);
dam = RandomIntBetween(mindam, maxdam);
if (missileData.isArrow() && damageType == DamageType::Physical)
dam += player._pIBonusDamMod + player._pDamageMod + dam * player._pIBonusDam / 100;
if (!shift)
@ -956,7 +956,7 @@ bool MonsterTrapHit(int monsterId, int mindam, int maxdam, int dist, MissileID t
}
bool resist = monster.isResistant(t, damageType);
int dam = mindam + GenerateRnd(maxdam - mindam + 1);
int dam = RandomIntBetween(mindam, maxdam);
if (!shift)
dam <<= 6;
if (resist)
@ -1064,13 +1064,14 @@ bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd,
dam = player._pHitPoints / 3;
} else {
if (!shift) {
dam = (mind << 6) + GenerateRnd(((maxd - mind) << 6) + 1);
// New method fixes a bug which caused the maximum possible damage value to be 63/64ths too low.
dam = RandomIntBetween(mind << 6, maxd << 6);
if (monster == nullptr)
if (HasAnyOf(player._pIFlags, ItemSpecialEffect::HalfTrapDamage))
dam /= 2;
dam += player._pIGetHit * 64;
} else {
dam = mind + GenerateRnd(maxd - mind + 1);
dam = RandomIntBetween(mind, maxd);
if (monster == nullptr)
if (HasAnyOf(player._pIFlags, ItemSpecialEffect::HalfTrapDamage))
dam /= 2;
@ -2587,7 +2588,7 @@ void AddInferno(Missile &missile, AddMissileParameter &parameter)
missile._midam = 8 * i + 16 + ((8 * i + 16) / 2);
} else {
Monster &monster = Monsters[missile._misource];
missile._midam = monster.minDamage + GenerateRnd(monster.maxDamage - monster.minDamage + 1);
missile._midam = RandomIntBetween(monster.minDamage, monster.maxDamage);
}
}
@ -3264,7 +3265,7 @@ void ProcessLightningControl(Missile &missile)
dam = (GenerateRnd(2) + GenerateRnd(Players[missile._misource].getCharacterLevel()) + 2) << 6;
} else {
Monster &monster = Monsters[missile._misource];
dam = 2 * (monster.minDamage + GenerateRnd(monster.maxDamage - monster.minDamage + 1));
dam = 2 * RandomIntBetween(monster.minDamage, monster.maxDamage);
}
SpawnLightning(missile, dam);

9
Source/monster.cpp

@ -151,7 +151,7 @@ void InitMonster(Monster &monster, Direction rd, size_t typeIndex, Point positio
monster.animInfo.tickCounterOfCurrentFrame = GenerateRnd(monster.animInfo.ticksPerFrame - 1);
monster.animInfo.currentFrame = GenerateRnd(monster.animInfo.numberOfFrames - 1);
int maxhp = monster.data().hitPointsMinimum + GenerateRnd(monster.data().hitPointsMaximum - monster.data().hitPointsMinimum + 1);
int maxhp = RandomIntBetween(monster.data().hitPointsMinimum, monster.data().hitPointsMaximum);
if (monster.type().type == MT_DIABLO && !gbIsHellfire) {
maxhp /= 2;
}
@ -1051,7 +1051,7 @@ void MonsterAttackMonster(Monster &attacker, Monster &target, int hper, int mind
if (hit >= hper)
return;
int dam = (mind + GenerateRnd(maxd - mind + 1)) << 6;
int dam = RandomIntBetween(mind, maxd) << 6;
ApplyMonsterDamage(DamageType::Physical, target, dam);
if (attacker.isPlayerMinion()) {
@ -1156,7 +1156,8 @@ void MonsterAttackPlayer(Monster &monster, Player &player, int hit, int minDam,
}
}
}
int dam = (minDam << 6) + GenerateRnd(((maxDam - minDam) << 6) + 1);
// New method fixes a bug which caused the maximum possible damage value to be 63/64ths too low.
int dam = RandomIntBetween(minDam << 6, maxDam << 6);
dam = std::max(dam + (player._pIGetHit << 6), 64);
if (&player == MyPlayer) {
if (player.wReflections > 0) {
@ -2612,7 +2613,7 @@ void CounselorAi(Monster &monster)
if (distanceToEnemy >= 2) {
if (v < 5 * (monster.intelligence + 10) && LineClearMissile(monster.position.tile, monster.enemyPosition)) {
constexpr MissileID MissileTypes[4] = { MissileID::Firebolt, MissileID::ChargedBolt, MissileID::LightningControl, MissileID::Fireball };
StartRangedAttack(monster, MissileTypes[monster.intelligence], monster.minDamage + GenerateRnd(monster.maxDamage - monster.minDamage + 1));
StartRangedAttack(monster, MissileTypes[monster.intelligence], RandomIntBetween(monster.minDamage, monster.maxDamage));
} else if (GenerateRnd(100) < 30) {
monster.goal = MonsterGoal::Move;
monster.goalVar1 = 0;

6
Source/player.cpp

@ -546,12 +546,13 @@ bool PlrHitMonst(Player &player, Monster &monster, bool adjacentDamage = false)
}
if (gbIsHellfire && HasAllOf(player._pIFlags, ItemSpecialEffect::FireDamage | ItemSpecialEffect::LightningDamage)) {
// Fixed off by 1 error from Hellfire
int midam = RandomIntBetween(player._pIFMinDam, player._pIFMaxDam);
AddMissile(player.position.tile, player.position.temp, player._pdir, MissileID::SpectralArrow, TARGET_MONSTERS, player, midam, 0);
}
int mind = player._pIMinDam;
int maxd = player._pIMaxDam;
int dam = GenerateRnd(maxd - mind + 1) + mind;
int dam = RandomIntBetween(mind, maxd);
dam += dam * player._pIBonusDam / 100;
dam += player._pIBonusDamMod;
int dam2 = dam << 6;
@ -719,7 +720,7 @@ bool PlrHitPlr(Player &attacker, Player &target)
int mind = attacker._pIMinDam;
int maxd = attacker._pIMaxDam;
int dam = GenerateRnd(maxd - mind + 1) + mind;
int dam = RandomIntBetween(mind, maxd);
dam += (dam * attacker._pIBonusDam) / 100;
dam += attacker._pIBonusDamMod + attacker._pDamageMod;
@ -866,6 +867,7 @@ bool DoRangeAttack(Player &player)
mistype = MissileID::LightningArrow;
}
if (HasAllOf(player._pIFlags, ItemSpecialEffect::FireArrows | ItemSpecialEffect::LightningArrows)) {
// Fixed off by 1 error from Hellfire
dmg = RandomIntBetween(player._pIFMinDam, player._pIFMaxDam);
mistype = MissileID::SpectralArrow;
}

Loading…
Cancel
Save