diff options
author | megamage <none@none> | 2008-12-17 23:27:01 -0600 |
---|---|---|
committer | megamage <none@none> | 2008-12-17 23:27:01 -0600 |
commit | dbfb8b66561347457116c0160bca3261df040682 (patch) | |
tree | fc3c20c8417c40ab25030fa4ea0b8762986d88bf /src | |
parent | bb415d08f81414d252eecbfa0cd4b2419942f978 (diff) |
*Fix melee spell damage calculation.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/SpellEffects.cpp | 107 |
1 files changed, 60 insertions, 47 deletions
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index b5657f9bcba..a11fa495d00 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -4203,25 +4203,17 @@ void Spell::EffectWeaponDmg(uint32 i) } // some spell specific modifiers - //bool customBonusDamagePercentMod = false; - //float bonusDamagePercentMod = 1.0f; // applied to fixed effect damage bonus if set customBonusDamagePercentMod - float weaponDamagePercentMod = 1.0f; // applied to weapon damage (and to fixed effect damage bonus if customBonusDamagePercentMod not set + //float weaponDamagePercentMod = 1.0f; // applied to weapon damage (and to fixed effect damage bonus if customBonusDamagePercentMod not set float totalDamagePercentMod = 1.0f; // applied to final bonus+weapon damage - bool normalized = false; + int32 fixed_bonus = 0; int32 spell_bonus = 0; // bonus specific for spell switch(m_spellInfo->SpellFamilyName) { case SPELLFAMILY_WARRIOR: { - // Whirlwind, single only spell with 2 weapon white damage apply if have - if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & 0x00000400000000LL)) - { - if(((Player*)m_caster)->GetWeaponForAttack(OFF_ATTACK,true)) - spell_bonus += m_caster->CalculateDamage (OFF_ATTACK, normalized); - } // Devastate bonus and sunder armor refresh - else if(m_spellInfo->SpellVisual == 671 && m_spellInfo->SpellIconID == 1508) + if(m_spellInfo->SpellVisual == 671 && m_spellInfo->SpellIconID == 1508) { uint32 stack = 0; @@ -4244,7 +4236,7 @@ void Spell::EffectWeaponDmg(uint32 i) { if(m_spellInfo->Effect[j] == SPELL_EFFECT_NORMALIZED_WEAPON_DMG) { - spell_bonus += (stack - 1) * CalculateDamage(j, unitTarget); + fixed_bonus += (stack - 1) * CalculateDamage(j, unitTarget); break; } } @@ -4277,14 +4269,14 @@ void Spell::EffectWeaponDmg(uint32 i) } case SPELLFAMILY_ROGUE: { - // Ambush - /*if(m_spellInfo->SpellFamilyFlags & 0x00000200LL) + // Hemorrhage + if(m_spellInfo->SpellFamilyFlags & 0x2000000) { - customBonusDamagePercentMod = true; - bonusDamagePercentMod = 2.5f; // 250% - }*/ + if(m_caster->GetTypeId()==TYPEID_PLAYER) + ((Player*)m_caster)->AddComboPoints(unitTarget, 1); + } // Mutilate (for each hand) - if(m_spellInfo->SpellFamilyFlags & 0x600000000LL) + else if(m_spellInfo->SpellFamilyFlags & 0x600000000LL) { bool found = false; // fast check @@ -4336,19 +4328,32 @@ void Spell::EffectWeaponDmg(uint32 i) } } } + break; + } + case SPELLFAMILY_DRUID: + { + // Mangle (Cat): CP + if(m_spellInfo->SpellFamilyFlags==0x0000040000000000LL) + { + if(m_caster->GetTypeId()==TYPEID_PLAYER) + ((Player*)m_caster)->AddComboPoints(unitTarget,1); + } + break; } } - for (int j = 0; j < 3; j++) + bool normalized = false; + float weaponDamagePercentMod = 1.0; + for (int j = 0; j < 3; ++j) { switch(m_spellInfo->Effect[j]) { case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: - spell_bonus += CalculateDamage(j,unitTarget); + fixed_bonus += CalculateDamage(j,unitTarget); break; case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: - spell_bonus += CalculateDamage(j,unitTarget); + fixed_bonus += CalculateDamage(j,unitTarget); normalized = true; break; case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: @@ -4358,13 +4363,8 @@ void Spell::EffectWeaponDmg(uint32 i) } } - //fixed_bonus = int32(fixed_bonus*weaponDamagePercentMod); - - // non-weapon damage - int32 bonus = spell_bonus;// + fixed_bonus; - // apply to non-weapon bonus weapon total pct effect, weapon total flat effect included in weapon damage - if(bonus) + if(fixed_bonus || spell_bonus) { UnitMods unitMod; switch(m_attackType) @@ -4376,36 +4376,49 @@ void Spell::EffectWeaponDmg(uint32 i) } float weapon_total_pct = m_caster->GetModifierValue(unitMod, TOTAL_PCT); - bonus = int32(bonus*weapon_total_pct); + + if(fixed_bonus) + fixed_bonus = int32(fixed_bonus * weapon_total_pct); + if(spell_bonus) + spell_bonus = int32(spell_bonus * weapon_total_pct); } + + int32 weaponDamage = m_caster->CalculateDamage(m_attackType, normalized); - // + weapon damage with applied weapon% dmg to base weapon damage in call - bonus += int32(m_caster->CalculateDamage(m_attackType, normalized)*weaponDamagePercentMod); + // Sequence is important + for (int j = 0; j < 3; ++j) + { + // We assume that a spell have at most one fixed_bonus + // and at most one weaponDamagePercentMod + switch(m_spellInfo->Effect[j]) + { + case SPELL_EFFECT_WEAPON_DAMAGE: + case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: + case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: + weaponDamage += fixed_bonus; + break; + case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: + weaponDamage = int32(weaponDamage * weaponDamagePercentMod); + default: + break; // not weapon damage effect, just skip + } + } - // total damage - bonus = int32(bonus*totalDamagePercentMod); + // only for Seal of Command + if(spell_bonus) + weaponDamage += spell_bonus; + + // only for Mutilate + if(totalDamagePercentMod != 1.0f) + weaponDamage = int32(weaponDamage * totalDamagePercentMod); // prevent negative damage - uint32 eff_damage = uint32(bonus > 0 ? bonus : 0); + uint32 eff_damage = uint32(weaponDamage > 0 ? weaponDamage : 0); // Add melee damage bonuses (also check for negative) m_caster->MeleeDamageBonus(unitTarget, &eff_damage, m_attackType, m_spellInfo); m_damage+= eff_damage; - // Hemorrhage - if(m_spellInfo->SpellFamilyName==SPELLFAMILY_ROGUE && (m_spellInfo->SpellFamilyFlags & 0x2000000)) - { - if(m_caster->GetTypeId()==TYPEID_PLAYER) - ((Player*)m_caster)->AddComboPoints(unitTarget, 1); - } - - // Mangle (Cat): CP - if(m_spellInfo->SpellFamilyName==SPELLFAMILY_DRUID && (m_spellInfo->SpellFamilyFlags==0x0000040000000000LL)) - { - if(m_caster->GetTypeId()==TYPEID_PLAYER) - ((Player*)m_caster)->AddComboPoints(unitTarget,1); - } - // take ammo if(m_attackType == RANGED_ATTACK && m_caster->GetTypeId() == TYPEID_PLAYER) { |