diff --git a/src/map/battle.cpp b/src/map/battle.cpp index bccc4ce6d7..06aeadfc6b 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5750,22 +5750,40 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list * } #ifdef RENEWAL - /** - * RE DEF Reduction - * Damage = Attack * (4000+eDEF)/(4000+eDEF*10) - sDEF - * Pierce defence gains 1 atk per def/2 - */ - if( def1 == -400 ) /* -400 creates a division by 0 and subsequently crashes */ - def1 = -399; - ATK_ADD2(wd->damage, wd->damage2, - is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ? (def1*battle_calc_attack_skill_ratio(wd, src, target, skill_id, skill_lv))/200 : 0, - is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ? (def1*battle_calc_attack_skill_ratio(wd, src, target, skill_id, skill_lv))/200 : 0 - ); - if( !attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_R) && !is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ) - wd->damage = wd->damage * (4000+def1) / (4000+10*def1) - vit_def; - if( is_attack_left_handed(src, skill_id) && !attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_L) && !is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ) - wd->damage2 = wd->damage2 * (4000+def1) / (4000+10*def1) - vit_def; + switch(skill_id) { + case RK_DRAGONBREATH: + case RK_DRAGONBREATH_WATER: + case NC_ARMSCANNON: + case GN_CARTCANNON: + if (attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_R) || attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_L)) + return; + if (is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) || is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L)) + return; + // Defense reduction by flat value. + // This completely bypasses the normal RE DEF Reduction formula. + wd->damage -= (def1 + vit_def); + if (is_attack_left_handed(src, skill_id)) + wd->damage2 -= (def1 + vit_def); + break; + /** + * RE DEF Reduction + * Damage = Attack * (4000+eDEF)/(4000+eDEF*10) - sDEF + * Pierce defence gains 1 atk per def/2 + */ + default: + if( def1 == -400 ) /* -400 creates a division by 0 and subsequently crashes */ + def1 = -399; + ATK_ADD2(wd->damage, wd->damage2, + is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ? (def1*battle_calc_attack_skill_ratio(wd, src, target, skill_id, skill_lv))/200 : 0, + is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ? (def1*battle_calc_attack_skill_ratio(wd, src, target, skill_id, skill_lv))/200 : 0 + ); + if( !attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_R) && !is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_R) ) + wd->damage = wd->damage * (4000+def1) / (4000+10*def1) - vit_def; + if( is_attack_left_handed(src, skill_id) && !attack_ignores_def(wd, src, target, skill_id, skill_lv, EQI_HAND_L) && !is_attack_piercing(wd, src, target, skill_id, skill_lv, EQI_HAND_L) ) + wd->damage2 = wd->damage2 * (4000+def1) / (4000+10*def1) - vit_def; + break; + } #else if (def1 > 100) def1 = 100; ATK_RATE2(wd->damage, wd->damage2,