From 4cff046ba946859fca1d9e4cb07df950f9773928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pir=C3=B3g?= <69601940+aetn23@users.noreply.github.com> Date: Sun, 18 Sep 2022 17:26:23 +0200 Subject: [PATCH] Replace toHitSpecial member with a function & fix wrong arguments being passed (#5337) --- Source/loadsave.cpp | 2 +- Source/monster.cpp | 28 +++++++++++++++++++--------- Source/monster.h | 10 ++++++++-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 3cefa89c5..f0f8a7e08 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -1404,7 +1404,7 @@ void SaveMonster(SaveHelper *file, Monster &monster) file->WriteLE(static_cast(std::min(monster.toHit, std::numeric_limits::max()))); // For backwards compatibility file->WriteLE(monster.minDamage); file->WriteLE(monster.maxDamage); - file->WriteLE(static_cast(std::min(monster.toHitSpecial, std::numeric_limits::max()))); // For backwards compatibility + file->WriteLE(static_cast(std::min(monster.toHitSpecial(sgGameInitInfo.nDifficulty), std::numeric_limits::max()))); // For backwards compatibility file->WriteLE(monster.minDamageSpecial); file->WriteLE(monster.maxDamageSpecial); file->WriteLE(monster.armorClass); diff --git a/Source/monster.cpp b/Source/monster.cpp index 3f4414c56..ad9b976e5 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -157,7 +157,6 @@ void InitMonster(Monster &monster, Direction rd, size_t typeIndex, Point positio monster.toHit = monster.data().toHit; monster.minDamage = monster.data().minDamage; monster.maxDamage = monster.data().maxDamage; - monster.toHitSpecial = monster.data().toHitSpecial; monster.minDamageSpecial = monster.data().minDamageSpecial; monster.maxDamageSpecial = monster.data().maxDamageSpecial; monster.armorClass = monster.data().armorClass; @@ -184,7 +183,6 @@ void InitMonster(Monster &monster, Direction rd, size_t typeIndex, Point positio monster.toHit += NightmareToHitBonus; monster.minDamage = 2 * (monster.minDamage + 2); monster.maxDamage = 2 * (monster.maxDamage + 2); - monster.toHitSpecial += NightmareToHitBonus; monster.minDamageSpecial = 2 * (monster.minDamageSpecial + 2); monster.maxDamageSpecial = 2 * (monster.maxDamageSpecial + 2); monster.armorClass += NightmareAcBonus; @@ -198,7 +196,6 @@ void InitMonster(Monster &monster, Direction rd, size_t typeIndex, Point positio monster.toHit += HellToHitBonus; monster.minDamage = 4 * monster.minDamage + 6; monster.maxDamage = 4 * monster.maxDamage + 6; - monster.toHitSpecial += HellToHitBonus; monster.minDamageSpecial = 4 * monster.minDamageSpecial + 6; monster.maxDamageSpecial = 4 * monster.maxDamageSpecial + 6; monster.armorClass += HellAcBonus; @@ -1213,9 +1210,9 @@ void MonsterAttackPlayer(Monster &monster, Player &player, int hit, int minDam, void MonsterAttackEnemy(Monster &monster, int hit, int minDam, int maxDam) { if ((monster.flags & MFLAG_TARGETS_MONSTER) != 0) - MonsterAttackMonster(monster, Monsters[monster.enemy], monster.toHit, monster.minDamage, monster.maxDamage); + MonsterAttackMonster(monster, Monsters[monster.enemy], hit, minDam, maxDam); else - MonsterAttackPlayer(monster, Players[monster.enemy], monster.toHit, monster.minDamage, monster.maxDamage); + MonsterAttackPlayer(monster, Players[monster.enemy], hit, minDam, maxDam); } bool MonsterAttack(Monster &monster) @@ -1312,7 +1309,7 @@ bool MonsterRangedSpecialAttack(Monster &monster) bool MonsterSpecialAttack(Monster &monster) { if (monster.animInfo.currentFrame == monster.data().animFrameNumSpecial - 1) { - MonsterAttackEnemy(monster, monster.toHitSpecial, monster.minDamageSpecial, monster.maxDamageSpecial); + MonsterAttackEnemy(monster, monster.toHitSpecial(sgGameInitInfo.nDifficulty), monster.minDamageSpecial, monster.maxDamageSpecial); } if (monster.animInfo.isLastFrame()) { @@ -3154,14 +3151,11 @@ void PrepareUniqueMonst(Monster &monster, UniqueMonsterType monsterType, size_t if (uniqueMonsterData.customToHit != 0) { monster.toHit = uniqueMonsterData.customToHit; - monster.toHitSpecial = uniqueMonsterData.customToHit; if (sgGameInitInfo.nDifficulty == DIFF_NIGHTMARE) { monster.toHit += NightmareToHitBonus; - monster.toHitSpecial += NightmareToHitBonus; } else if (sgGameInitInfo.nDifficulty == DIFF_HELL) { monster.toHit += HellToHitBonus; - monster.toHitSpecial += HellToHitBonus; } } if (uniqueMonsterData.customArmorClass != 0) { @@ -4638,4 +4632,20 @@ bool Monster::tryLiftGargoyle() return false; } +unsigned int Monster::toHitSpecial(_difficulty difficulty) const +{ + unsigned int baseToHitSpecial = data().toHitSpecial; + if (isUnique() && UniqueMonstersData[static_cast(uniqueType)].customToHit != 0) { + baseToHitSpecial = UniqueMonstersData[static_cast(uniqueType)].customToHit; + } + + if (difficulty == DIFF_NIGHTMARE) { + baseToHitSpecial += NightmareToHitBonus; + } else if (difficulty == DIFF_HELL) { + baseToHitSpecial += HellToHitBonus; + } + + return baseToHitSpecial; +} + } // namespace devilution diff --git a/Source/monster.h b/Source/monster.h index 6248f60e7..f9faac1fc 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -196,9 +196,7 @@ struct Monster { // note: missing field _mAFNum uint32_t rndItemSeed; /** Seed used to determine AI behaviour/sync sounds in multiplayer games? */ uint32_t aiSeed; - uint16_t toHit; - uint16_t toHitSpecial; uint16_t resistance; _speech_id talkMsg; @@ -340,6 +338,14 @@ struct Monster { // note: missing field _mAFNum return monsterExp; } + /** + * @brief Calculates monster's chance to hit with special attack. + * Fetches base value from @p MonstersData array or @p UniqueMonstersData. + * @param difficulty - difficulty on which calculation is performed + * @return Monster's chance to hit with special attack, including bonuses from difficulty and monster being unique + */ + unsigned int toHitSpecial(_difficulty difficulty) const; + /** * @brief Calculates monster's level. * Fetches base level value from @p MonstersData array or @p UniqueMonstersData.