Here's where it's calculated w/ the bonuses (zone/bonuses.cpp):
around line 723
Code:
case SE_AvoidMeleeChance:
{
//multiplier is to be compatible with item effects
//watching for overflow too
effect_value = effect_value<3000? effect_value * 10 : 30000;
if(newbon->AvoidMeleeChance < effect_value)
newbon->AvoidMeleeChance = effect_value;
break;
}
around line 857
Code:
case SE_ProcChance:
{
//multiplier is to be compatible with item effects
//watching for overflow too
effect_value = effect_value<3000? effect_value * 10 : 30000;
if(newbon->ProcChance < effect_value)
newbon->ProcChance = effect_value;
break;
}
In the case of evasive, the effect_value (
base1 in
spells_us.txt) is 50, which should equate to 50%. I would think this would mean whatever our chance was would be reduced by that much (so something like
chancetohit *= (100 - mitigation) / 100). This is how it's calculated in the attack code:
zone/attack.cpp, around line 269
Code:
//subtract off avoidance by the defender
bonus = defender->spellbonuses.AvoidMeleeChance + defender->itembonuses.AvoidMeleeChance;
if(bonus > 0) {
chancetohit -= (bonus) / 10;
mlog(COMBAT__TOHIT, "Applied avoidance chance %.2f/10, yeilding %.2f", bonus, chancetohit);
}
However, it looks like item Avoidance isn't a straight percentage increase in mitigation. Since the spell effect is multiplied by 10, it looks like 1 point of Avoidance is equal to 0.1% mitigation. In addition, with the rule system, Avoidance is capped at 100, so 10% max. I'm thinking we can do something like this:
zone/attack.cpp
Code:
//subtract off avoidance by the defender
bonus = defender->spellbonuses.AvoidMeleeChance + defender->itembonuses.AvoidMeleeChance;
bonus /= 10; //Change from 10x, make it easier to read when converting to a percentage
if(bonus > 0) {
chancetohit *= (100 - bonus) / 100; //Decrease by %, so need to count down from 100, then divide by 100 to make it a percentage
mlog(COMBAT__TOHIT, "Applied avoidance chance %.2f/100, yeilding %.2f", bonus, chancetohit);
}
On a side note, I am a little confused: isn't mitigation supposed to be a decrease in damage from a swing, not a chance to completely avoid a hit? Shouldn't it only be completely avoiding a hit if we mitigate 100% (or more) of the damage? So, as a result, if a mob hit for 5000 damage max, and you had 50% mitigation, they would only hit for 2500 max? That's the way I remembered it from Live (although I never actually played a Warrior w/ Defensive), and why it was used for hard hitting mobs. It also made Warriors better tanks than other classes, because if you can mitigate 50% of the damage over a long duration (50% for 3 min w/
Defensive) vs all damage for a short duration (10000% for 2 ticks on
Fortitude Discipline), then you don't have to be healed as much. The reason I remember this specifically is because I wasn't in a huge guild, so our MT was a Shadowknight (RIP Eldark), which made a lot of the Velious bosses almost impossible to do without a Warrior tagalong because of the additional healing needed to keep him alive, even with better equip than the warrior (I think this was around Luclin?) If that's the case, then mitigation is very broken at the moment, but shouldn't be impossible to fix (just need to change what happens when, and how).
Now, as far as ProcBonus, it ends up being calculated in the attack code also:
zone/attack.cpp, around line 3664 (in Mob::GetProcChances)
Code:
ProcBonus += float(itembonuses.ProcChance + spellbonuses.ProcChance) / 1000.0f;
ProcChance = 0.05f + float(mydex) / 9000.0f; //Base chance, based on dex + static chance to proc
ProcBonus += (ProcChance * AABonus) / 100; //AA modifier in addition to normal ProcBonus from items & spells, percentage of base chance?
ProcChance += ProcBonus; //Add the bonuses to the base chance
mlog(COMBAT__PROCS, "Proc chance %.2f (%.2f from bonuses)", ProcChance, ProcBonus);
return ProcChance;
So, if we use
Jonthan's Mightful Caretaker as our example, the effect_value is 102, which ends up being 1020. In GetProcChances, we start with 0, then the spell value gets divided to 1.02. When we try the proc in Mob::TryWeaponProc (both with & without augs), also in zone/attack.cpp (around line 3674), we generate a random float between 0 & 1. Since 1.02 is always > anything between 0 & 1, we will proc 100% of the time.
I assume this is supposed to be a multiplier (200% = 2x as likely vs base, etc) instead of a direct mod on the proc chance. We should be able to do something like this:
Code:
ProcBonus += float(itembonuses.ProcChance + spellbonuses.ProcChance) / 1000.0f;
ProcChance = 0.05f + float(mydex) / 9000.0f;
ProcBonus += (ProcChance * AABonus) / 100;
ProcChance *= ProcBonus; //Multiplier instead of flat bonus
mlog(COMBAT__PROCS, "Proc chance %.2f (%.2f from bonuses)", ProcChance, ProcBonus);
return ProcChance;
If someone wants to try this and/or commit to SVN, feel free (I'm having some issues w/ Visual Studio after the change to zone.vcproj).