From 109c3b165c4d8b09ffe8cf70485fe717839b427b Mon Sep 17 00:00:00 2001 From: Eric Robinson <68359262+kphoenix137@users.noreply.github.com> Date: Sun, 22 Sep 2024 14:13:15 -0400 Subject: [PATCH] Bugfix/Refactor: Min-Max Damage Range Calculations (#7022) --- Source/missiles.cpp | 17 +++++++++-------- Source/monster.cpp | 9 +++++---- Source/player.cpp | 6 ++++-- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 2074a1ed8..2d5bc48b6 100644 --- a/Source/missiles.cpp +++ b/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 ¶meter) 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); diff --git a/Source/monster.cpp b/Source/monster.cpp index e8e70a42b..ab6adf876 100644 --- a/Source/monster.cpp +++ b/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; diff --git a/Source/player.cpp b/Source/player.cpp index bdb035528..2489fc473 100644 --- a/Source/player.cpp +++ b/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; }