View Single Post
  #5  
Old 02-21-2014, 05:28 PM
tristantio tristantio is offline
Fire Giant

tristantio's Avatar

Join Date: Nov 2010
Posts: 888
Default

I was just about to post that (was reading attack.cpp myself).

Important part:

Code:
// This is called when the Mob is the one being hit                                                                                                                                
int32 Mob::GetMeleeMitDmg(Mob *attacker, int32 damage, int32 minhit,
	        float mit_rating, float atk_rating)
{
	float d = 10.0;
	float mit_roll = MakeRandomFloat(0, mit_rating);
	float atk_roll = MakeRandomFloat(0, atk_rating);

	if (atk_roll > mit_roll) {
		float a_diff = atk_roll - mit_roll;
		float thac0 = atk_rating * RuleR(Combat, ACthac0Factor);
		float thac0cap = attacker->GetLevel() * 9 + 20;
		if (thac0 > thac0cap)
			thac0 = thac0cap;

		d -= 10.0 * (a_diff / thac0);
	} else if (mit_roll > atk_roll) {
		float m_diff = mit_roll - atk_roll;
		float thac20 = mit_rating * RuleR(Combat, ACthac20Factor);
		float thac20cap = GetLevel() * 9 + 20;
		if (thac20 > thac20cap)
			thac20 = thac20cap;

		d += 10.0 * (m_diff / thac20);
	}

	if (d < 0.0)
		d = 0.0;
	else if (d > 20.0)
		d = 20.0;

	float interval = (damage - minhit) / 20.0;
        damage -= ((int)d * interval);

	damage -= (minhit * itembonuses.MeleeMitigation / 100);
        damage -= (damage * spellbonuses.MeleeMitigation / 100);
        return damage;
}
And the call to that looks something like this:
Code:
 if (GetClass() == WIZARD || GetClass() == MAGICIAN ||
		                GetClass() == NECROMANCER || GetClass() == ENCHANTER)
			mitigation_rating = ((GetSkill(SkillDefense) + itembonuses.HeroicAGI/10) / 4.0) + armor + 1;
	        else
	                mitigation_rating = ((GetSkill(SkillDefense) + itembonuses.HeroicAGI/10) / 3.0) + (armor * 1.333333) + 1;
		mitigation_rating *= 0.847;

	        mitigation_rating = mod_mitigation_rating(mitigation_rating, attacker);

                if (attacker->IsClient())
			attack_rating = (attacker->CastToClient()->CalcATK() + ((attacker->GetSTR()-66) * 0.9) + (attacker->GetSkill(SkillOffense)*1.345));
                else
                        attack_rating = (attacker->GetATK() + (attacker->GetSkill(SkillOffense)*1.345) + ((attacker->GetSTR()-66) * 0.9));

                attack_rating = attacker->mod_attack_rating(attack_rating, this);

		damage = GetMeleeMitDmg(attacker, damage, minhit, mitigation_rating, attack_rating);
__________________
Realtime auction logger: http://ahungry.com/eqauctions/