@ -178,7 +178,6 @@ void InitMonster(Monster &monster, Direction rd, size_t typeIndex, Point positio
monster . rndItemSeed = AdvanceRndSeed ( ) ;
monster . aiSeed = AdvanceRndSeed ( ) ;
monster . whoHit = 0 ;
monster . toHit = monster . data ( ) . toHit ;
monster . minDamage = monster . data ( ) . minDamage ;
monster . maxDamage = monster . data ( ) . maxDamage ;
monster . minDamageSpecial = monster . data ( ) . minDamageSpecial ;
@ -204,7 +203,6 @@ void InitMonster(Monster &monster, Direction rd, size_t typeIndex, Point positio
else
monster . maxHitPoints + = 100 < < 6 ;
monster . hitPoints = monster . maxHitPoints ;
monster . toHit + = NightmareToHitBonus ;
monster . minDamage = 2 * ( monster . minDamage + 2 ) ;
monster . maxDamage = 2 * ( monster . maxDamage + 2 ) ;
monster . minDamageSpecial = 2 * ( monster . minDamageSpecial + 2 ) ;
@ -217,7 +215,6 @@ void InitMonster(Monster &monster, Direction rd, size_t typeIndex, Point positio
else
monster . maxHitPoints + = 200 < < 6 ;
monster . hitPoints = monster . maxHitPoints ;
monster . toHit + = HellToHitBonus ;
monster . minDamage = 4 * monster . minDamage + 6 ;
monster . maxDamage = 4 * monster . maxDamage + 6 ;
monster . minDamageSpecial = 4 * monster . minDamageSpecial + 6 ;
@ -1221,17 +1218,17 @@ void MonsterAttackEnemy(Monster &monster, int hit, int minDam, int maxDam)
bool MonsterAttack ( Monster & monster )
{
if ( monster . animInfo . currentFrame = = monster . data ( ) . animFrameNum - 1 ) {
MonsterAttackEnemy ( monster , monster . toHit , monster . minDamage , monster . maxDamage ) ;
MonsterAttackEnemy ( monster , monster . toHit ( sgGameInitInfo . nDifficulty ) , monster . minDamage , monster . maxDamage ) ;
if ( monster . ai ! = MonsterAIID : : Snake )
PlayEffect ( monster , MonsterSound : : Attack ) ;
}
if ( IsAnyOf ( monster . type ( ) . type , MT_NMAGMA , MT_YMAGMA , MT_BMAGMA , MT_WMAGMA ) & & monster . animInfo . currentFrame = = 8 ) {
MonsterAttackEnemy ( monster , monster . toHit + 10 , monster . minDamage - 2 , monster . maxDamage - 2 ) ;
MonsterAttackEnemy ( monster , monster . toHit ( sgGameInitInfo . nDifficulty ) + 10 , monster . minDamage - 2 , monster . maxDamage - 2 ) ;
PlayEffect ( monster , MonsterSound : : Attack ) ;
}
if ( IsAnyOf ( monster . type ( ) . type , MT_STORM , MT_RSTORM , MT_STORML , MT_MAEL ) & & monster . animInfo . currentFrame = = 12 ) {
MonsterAttackEnemy ( monster , monster . toHit - 20 , monster . minDamage + 4 , monster . maxDamage + 4 ) ;
MonsterAttackEnemy ( monster , monster . toHit ( sgGameInitInfo . nDifficulty ) - 20 , monster . minDamage + 4 , monster . maxDamage + 4 ) ;
PlayEffect ( monster , MonsterSound : : Attack ) ;
}
@ -3229,15 +3226,6 @@ tl::expected<void, std::string> PrepareUniqueMonst(Monster &monster, UniqueMonst
RETURN_IF_ERROR ( InitTRNForUniqueMonster ( monster ) ) ;
monster . uniqTrans = uniquetrans + + ;
if ( uniqueMonsterData . customToHit ! = 0 ) {
monster . toHit = uniqueMonsterData . customToHit ;
if ( sgGameInitInfo . nDifficulty = = DIFF_NIGHTMARE ) {
monster . toHit + = NightmareToHitBonus ;
} else if ( sgGameInitInfo . nDifficulty = = DIFF_HELL ) {
monster . toHit + = HellToHitBonus ;
}
}
if ( uniqueMonsterData . customArmorClass ! = 0 ) {
monster . armorClass = uniqueMonsterData . customArmorClass ;
@ -4656,7 +4644,7 @@ void SpawnGolem(Player &player, Monster &golem, Point position, Missile &missile
golem . maxHitPoints = 2 * ( 320 * missile . _mispllvl + player . _pMaxMana / 3 ) ;
golem . hitPoints = golem . maxHitPoints ;
golem . armorClass = 25 ;
golem . t oHit = 5 * ( missile . _mispllvl + 8 ) + 2 * player . getCharacterLevel ( ) ;
golem . golemT oHit = 5 * ( missile . _mispllvl + 8 ) + 2 * player . getCharacterLevel ( ) ;
golem . minDamage = 2 * ( missile . _mispllvl + 4 ) ;
golem . maxDamage = 2 * ( missile . _mispllvl + 8 ) ;
golem . flags | = MFLAG_GOLEM ;
@ -4827,6 +4815,25 @@ MonsterMode Monster::getVisualMonsterMode() const
return MonsterMode : : Petrified ;
}
unsigned int Monster : : toHit ( _difficulty difficulty ) const
{
if ( isPlayerMinion ( ) )
return golemToHit ;
unsigned int baseToHit = data ( ) . toHit ;
if ( isUnique ( ) & & UniqueMonstersData [ static_cast < size_t > ( uniqueType ) ] . customToHit ! = 0 ) {
baseToHit = UniqueMonstersData [ static_cast < size_t > ( uniqueType ) ] . customToHit ;
}
if ( difficulty = = DIFF_NIGHTMARE ) {
baseToHit + = NightmareToHitBonus ;
} else if ( difficulty = = DIFF_HELL ) {
baseToHit + = HellToHitBonus ;
}
return baseToHit ;
}
unsigned int Monster : : toHitSpecial ( _difficulty difficulty ) const
{
unsigned int baseToHitSpecial = data ( ) . toHitSpecial ;