@@ -1377,68 +1377,32 @@ uint32_t Battle::Unit::CalculateSpellDamage( const Spell & spell, uint32_t spell
1377
1377
{
1378
1378
assert ( spell.isDamage () );
1379
1379
1380
- // TODO: use fheroes2::getSpellDamage function to remove code duplication.
1381
1380
uint32_t dmg = fheroes2::getSpellDamage ( spell, spellPoints, applyingHero );
1382
-
1383
- switch ( GetID () ) {
1384
- case Monster::IRON_GOLEM:
1385
- case Monster::STEEL_GOLEM:
1386
- switch ( spell.GetID () ) {
1387
- // 50% damage
1388
- case Spell::COLDRAY:
1389
- case Spell::COLDRING:
1390
- case Spell::FIREBALL:
1391
- case Spell::FIREBLAST:
1392
- case Spell::LIGHTNINGBOLT:
1393
- case Spell::CHAINLIGHTNING:
1394
- case Spell::ELEMENTALSTORM:
1395
- case Spell::ARMAGEDDON:
1396
- dmg /= 2 ;
1397
- break ;
1398
- default :
1399
- break ;
1400
- }
1401
- break ;
1402
-
1403
- case Monster::WATER_ELEMENT:
1404
- switch ( spell.GetID () ) {
1405
- // 200% damage
1406
- case Spell::FIREBALL:
1407
- case Spell::FIREBLAST:
1408
- dmg *= 2 ;
1409
- break ;
1410
- default :
1411
- break ;
1412
- }
1413
- break ;
1414
-
1415
- case Monster::AIR_ELEMENT:
1416
- switch ( spell.GetID () ) {
1417
- // 200% damage
1418
- case Spell::ELEMENTALSTORM:
1419
- case Spell::LIGHTNINGBOLT:
1420
- case Spell::CHAINLIGHTNING:
1421
- dmg *= 2 ;
1422
- break ;
1423
- default :
1424
- break ;
1381
+ for ( const fheroes2::MonsterAbility & targetAbility : fheroes2::getMonsterData ( GetID () ).battleStats .abilities ) {
1382
+ if ( targetAbility.type == fheroes2::MonsterAbilityType::ELEMENTAL_SPELL_DAMAGE_REDUCTION ) {
1383
+ switch ( spell.GetID () ) {
1384
+ // Reduced elemental spell damage
1385
+ case Spell::COLDRAY:
1386
+ case Spell::COLDRING:
1387
+ case Spell::FIREBALL:
1388
+ case Spell::FIREBLAST:
1389
+ case Spell::LIGHTNINGBOLT:
1390
+ case Spell::CHAINLIGHTNING:
1391
+ case Spell::ELEMENTALSTORM:
1392
+ case Spell::ARMAGEDDON:
1393
+ dmg -= dmg * targetAbility.percentage / 100 ;
1394
+ break ;
1395
+ default :
1396
+ break ;
1397
+ }
1425
1398
}
1426
- break ;
1427
-
1428
- case Monster::FIRE_ELEMENT:
1429
- switch ( spell.GetID () ) {
1430
- // 200% damage
1431
- case Spell::COLDRAY:
1432
- case Spell::COLDRING:
1433
- dmg *= 2 ;
1434
- break ;
1435
- default :
1436
- break ;
1399
+ }
1400
+ for ( const fheroes2::MonsterWeakness & targetWeakness : fheroes2::getMonsterData ( GetID () ).battleStats .weaknesses ) {
1401
+ if ( targetWeakness.type == fheroes2::MonsterWeaknessType::EXTRA_DAMAGE_FROM_CERTAIN_SPELL ) {
1402
+ if ( spell.GetID () == (int )targetWeakness.value ) {
1403
+ dmg += dmg * targetWeakness.percentage / 100 ;
1404
+ }
1437
1405
}
1438
- break ;
1439
-
1440
- default :
1441
- break ;
1442
1406
}
1443
1407
1444
1408
// check artifact
0 commit comments