EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Development::Feature Requests (https://www.eqemulator.org/forums/forumdisplay.php?f=612)
-   -   Critical Spell casting Rule (https://www.eqemulator.org/forums/showthread.php?t=26545)

ChaosSlayer 10-17-2008 07:33 PM

Critical Spell casting Rule
 
we allready have Rule for Client and NPC critical melee - why not spell casting?

I recomend we add it
we will need CriticalSpellChance for NPC, general Client, and separatetly for Wizards I guess

Dodie 10-21-2008 06:00 PM

Much indeed

AndMetal 10-21-2008 09:00 PM

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);
                }


ChaosSlayer 10-21-2008 10:23 PM

you are the coder AndMetal :D
You are our only hope :cool:

Dodie 10-25-2008 01:51 PM

Cool hope this gets implented

Rocker8956 10-25-2008 02:20 PM

I think it was already implemented in rev127 of the SVN.

http://code.google.com/p/projecteqemu/updates/list

ChaosSlayer 10-25-2008 05:45 PM

well some of us stil waiting for OFFICIAL release posted at download section =)

its been a while

but anyway I thank Addmetal for puting in the code on such short notice =)

ChaosSlayer 10-25-2008 09:30 PM

ok i have looked at changelog and have few questions.

AndMetal: New rules for tweaking spell crits: Spells:BaseCritChance(0), Spells:BaseCritRatio(0), Spells:WizCritLevel(12), Spells:WizCritChance(7), Spells:WizCritRatio(15)


What the difirence bewten Ratio and Chance?
also dose Base only applies only to client (players) or NPCs too?

AndMetal 10-26-2008 06:38 PM

Quote:

Originally Posted by ChaosSlayer (Post 159106)
AndMetal: New rules for tweaking spell crits: Spells:BaseCritChance(0), Spells:BaseCritRatio(0), Spells:WizCritLevel(12), Spells:WizCritChance(7), Spells:WizCritRatio(15)


What the difirence bewten Ratio and Chance?

Chance: % chance to crit
Ratio: % of additional damage (100% = 2x damage)

Quote:

Originally Posted by ChaosSlayer (Post 159106)
dose Base only applies only to client (players) or NPCs too?

The function is in the Client class (Client::GetActSpellDamage), so that means this would only apply towards clients. Honestly, I don't think there's anything that allows an NPC to crit. If we added this, it would have to be a part of the Mob class (so Mob::GetActSpellDamage, which applies towards both clients & NPCs), unless we wanted it to be different for NPCs (then NPC::GetActSpellDamage).

ChaosSlayer 10-26-2008 11:31 PM

Quote:

Originally Posted by AndMetal (Post 159144)
Chance: % chance to crit
Ratio: % of additional damage (100% = 2x damage)



The function is in the Client class (Client::GetActSpellDamage), so that means this would only apply towards clients. Honestly, I don't think there's anything that allows an NPC to crit. If we added this, it would have to be a part of the Mob class (so Mob::GetActSpellDamage, which applies towards both clients & NPCs), unless we wanted it to be different for NPCs (then NPC::GetActSpellDamage).

I see.
the reason I asked is cuase there is a melee critical for mobs in Rules which works rather nicely

AndMetal 10-27-2008 12:35 AM

I think the big question here is, do mobs crit spells on Live? I don't remember them critting, but it may have changed. If not, I'm sure this would do well as custom code.

Looking into the code, GetActSpellDamage is a virtual function already defined in zone/mob.h in the Mob class, and just returns the damage passed to it, unmodified, by default. That means we just need to add the function for NPCs somewhere (probably also in zone/effects.cpp & declared in zone/npc.h).

ChaosSlayer 10-27-2008 12:59 AM

Quote:

Originally Posted by AndMetal (Post 159160)
I think the big question here is, do mobs crit spells on Live? I don't remember them critting, but it may have changed. If not, I'm sure this would do well as custom code.

Looking into the code, GetActSpellDamage is a virtual function already defined in zone/mob.h in the Mob class, and just returns the damage passed to it, unmodified, by default. That means we just need to add the function for NPCs somewhere (probably also in zone/effects.cpp & declared in zone/npc.h).

well back from when I played on LIVE mobs did not melee critical neither - at least you would never know that unless mob woudl hit you for some abnormal ammount of damage.

with spell it was even greater mistery. For a very long time you did not even know how much you been nuked for (you would simply see a message like - "you are bathed in fire" and no dmg was specified), and considering that critical doubles dmg done (unlike other games like say WoW where critical automaticly outputs Max dmg posible and then doubles it) - its prety much imposible to check unless due to chance you get nuked for some ungoodly ammount of damage

Personaly I don't realy concern with it. I am simply coming from bases that if Mobs Melee Critical was put it - I don't see a reason not to put in mob spell critical :cool:

paaco 11-17-2008 12:35 PM

Did this ever make it into the CVS? I was trying to look through it and figure out why it's not working on my server. Doesn't appear to be there but I have the rules for it in my DB.

paaco 11-17-2008 12:49 PM

OK I didn't look very well, it is in the source actually. It doesn't work on my server at all though.

trevius 11-17-2008 05:08 PM

You need to be downloading the newer versions of the emu code from the new SVN here:

http://code.google.com/p/projecteqemu/


All times are GMT -4. The time now is 11:46 PM.

Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.