Browse Source

Replace toHitSpecial member with a function & fix wrong arguments being passed (#5337)

pull/5361/head
Mikołaj Piróg 4 years ago committed by GitHub
parent
commit
4cff046ba9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      Source/loadsave.cpp
  2. 28
      Source/monster.cpp
  3. 10
      Source/monster.h

2
Source/loadsave.cpp

@ -1404,7 +1404,7 @@ void SaveMonster(SaveHelper *file, Monster &monster)
file->WriteLE<uint8_t>(static_cast<uint8_t>(std::min<uint16_t>(monster.toHit, std::numeric_limits<uint8_t>::max()))); // For backwards compatibility
file->WriteLE<uint8_t>(monster.minDamage);
file->WriteLE<uint8_t>(monster.maxDamage);
file->WriteLE<uint8_t>(static_cast<uint8_t>(std::min<uint16_t>(monster.toHitSpecial, std::numeric_limits<uint8_t>::max()))); // For backwards compatibility
file->WriteLE<uint8_t>(static_cast<uint8_t>(std::min<uint16_t>(monster.toHitSpecial(sgGameInitInfo.nDifficulty), std::numeric_limits<uint8_t>::max()))); // For backwards compatibility
file->WriteLE<uint8_t>(monster.minDamageSpecial);
file->WriteLE<uint8_t>(monster.maxDamageSpecial);
file->WriteLE<uint8_t>(monster.armorClass);

28
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<size_t>(uniqueType)].customToHit != 0) {
baseToHitSpecial = UniqueMonstersData[static_cast<size_t>(uniqueType)].customToHit;
}
if (difficulty == DIFF_NIGHTMARE) {
baseToHitSpecial += NightmareToHitBonus;
} else if (difficulty == DIFF_HELL) {
baseToHitSpecial += HellToHitBonus;
}
return baseToHitSpecial;
}
} // namespace devilution

10
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.

Loading…
Cancel
Save