Here's the spell crit code:
zone/effects.cpp, around line 95 in Client::GetActSpellDamage()
Code:
if(tt != ST_Self) {
int chance = 0;
sint32 ratio = 0;
//normal spell crit
if(GetClass() == WIZARD && GetLevel() > 11) {
chance += 7;
ratio += 15;
}
//Normal EQ: no class that has ingenuity has reg spell crit AAs too but people
//are free to customize so lets make sure they don't stack oddly.
//afaik all ranks provide a 100% bonus in damage on critical
switch(GetAA(aaIngenuity))
{
case 1:
case 2:
case 3:
if(ratio < 100)
ratio = 100;
break;
default:
break;
}
if(tt == ST_Target || tt == ST_Summoned || tt == ST_Undead) {
//DD spells only...
//reference: http://www.graffe.com/AA/
switch (GetAA(aaSpellCastingFury)) //not sure why this was different from Mastery before, both are DD only
{
case 1:
chance += 2;
ratio += 33;
break;
case 2:
chance += 4; //some reports between 4.5% & 5%, AA description indicates 4%
ratio += 66;
break;
case 3:
chance += 7;
ratio += 100;
break;
}
switch (GetAA(aaSpellCastingFuryMastery)) //ratio should carry over from Spell Casting Fury, which is 100% for all ranks
{
case 1:
chance += 3; //10%, Graffe = 9%?
break;
case 2:
chance += 5; //12%, Graffe = 11%?
break;
case 3:
chance += 7; //14%, Graffe = 13%?
break;
}
chance += GetAA(aaFuryofMagic) * 2; //doesn't look like this is used
chance += GetAA(aaFuryofMagicMastery) * 2; //doesn't look like this is used
chance += GetAA(aaFuryofMagicMastery2) * 2; //this is the current one used in DB; 16%, 18%, 20%; Graffe guesses 18-19% max
chance += GetAA(aaAdvancedFuryofMagicMastery) * 2; //guessing, not much data on it
if(ratio < 100) //chance increase and ratio are made up, not confirmed
ratio = 100;
} else if(tt == ST_Tap) {
if(ratio < 100) //chance increase and ratio are made up, not confirmed
ratio = 100;
if(spells[spell_id].classes[SHADOWKNIGHT-1] >= 254 && spell_id != SPELL_LEECH_TOUCH){
switch (GetAA(aaSoulAbrasion)) //Soul Abrasion
{
case 1:
modifier += 100;
break;
case 2:
modifier += 200;
break;
case 3:
modifier += 300;
break;
}
}
}
chance += GetAA(aaIngenuity); //nothing stating it's DD only, so we'll apply to all damage spells
chance += GetFocusEffect(focusImprovedCritical, spell_id);
//crit damage modifiers
if (GetClass() == WIZARD) { //wizards get an additional bonus
ratio += GetAA(aaDestructiveFury) * 8; //108%, 116%, 124%, close to Graffe's 207%, 215%, & 225%
} else {
switch (GetAA(aaDestructiveFury)) //not quite linear
{
case 1:
ratio += 4; //104%, Graffe = 103%
break;
case 2:
ratio += 8; //108%, Graffe = 107%
break;
case 3:
ratio += 16; //116%, Graffe = 115%
}
}
if(chance > 0 && MakeRandomInt(0,100) <= chance) {
modifier += modifier*ratio/100;
entity_list.MessageClose(this, false, 100, MT_SpellCrits, "%s delivers a critical blast! (%d)", GetName(), ((-value * modifier) / 100));
}
}
Are you thinking something like this?
Code:
if(tt != ST_Self) {
int chance = RuleI(Spells, BaseCritChance);
sint32 ratio = RuleI(Spells, BaseCritRatio);
//normal spell crit
if(GetClass() == WIZARD && GetLevel() > 11) {
chance += RuleI(Spells, WizCritChance);
ratio += RuleI(Spells, WizCritRatio);
}