Knight of the Blazing Sun, Bright Wizard, Witch Hunter, Warrior Priest
Forum rules
Before posting on this forum, be sure to read the Terms of Use
Your topic MUST start with your class name between hooks (IE : [Shaman] blablabla)
A couple of months ago I build a simple damage simulator for my Bright Wizard. The original intention was to figure out if the disrupt strikethrough that was available through the Beastlord, Genesis and Conquerer set were worth the loss in critical chance to hit. This was motivated by the fact that there were certain Shamans around that felt utterly unkillable to me.
Fast forward. A couple of weeks ago the defense mechanism were radically changed. Since then there have been a number of threads regarding the state of BWs and Sorcs. When reading these threads the lack of actual, reliable numbers becomes painfully obvious.
In this thread I want to attempt to provide some well founded numbers to the BW/Sorc vs Disrupt problematic.
However this whole disrupt problematic is not that tirival from a single target BW perspective. The reason for that are
time dependent debuffs e.g. Willpower, Resistance, Thoughness
interdependent procs e.g. Reactionary - Increasing your disrupt chance when defended against an attack
Lots of probabilistic elements e.g. defense roll, crit roll, crit damage distribution roll, proc chances
My approach to this problematic is based in the law of large numbers. It basically means that if I can collect enough data than random events (positive and negative) will average themselves out. For this purpose I usually work with 1 or 10 million data sets.
Formulas
This is a summary of my understanding of the combat formulas (that are relevant for this probelm) and therefore the basis for what I wrote into code. I hope it's self explanatory to the people who are interested in this kind of stuff.
Source
The formula in that post is not entirely correct. On RoR the damage reduction through Thoughness gets also modified by <Offensive Modifiers>. I tested this with Vengeance of Nagarythe. In addition caster dont have a dps contribution. I haven't tested the way Offensive and Defensive Modifiers interact with each other, yet. This is just an assumption.
<Defense Modified> = <Defense Stats> + <Sum of disrupt bonus> - <Sum of % based strikethrough)
If <Defense Modified> >= random(0,1+<Strikethrough Stats>) then the spell is defended
Source
That thread is a huge mess. I'm reasonably sure I got it right. But there might be some further iterations to the code that hasn't been disclosed yet.
The Code
The code is written in MATLAB/Octave. Not the most well known language but that what I had on my laptop when I started this months ago. I didn't spent too much time on documentation because quite frankly: I dont believe more than 5 people will look at that code. And these people can contact me if they have questions. I did verify the code to the best of my abilities and knowledge but that doesnt mean it's 100% accurate or bug free.
The basic concept is that you define a list of spells that will be used in your rotation. Based on that a list of actions is created e.g. when DoT X hits. With this list the actual combat calculations are done. For the combat calculation I use almost execlusivly matrix manipulations. Reason for that is a) that is the strong point of MATLAB b) it's the only way I could think of solving 10 milion or more calculations in parallel.
I'm more or less self taught in everything coding related. So there are probably better ways to do it and a ton of coding standards/conventions I violated. But thats what you got . Any one my hardware (i5 6600K with 8 GB RAM) the calculations take about
1 million --> 4 seconds
10 million --> 60-90 seconds
1 billion --> MATLAB goes crazy
Octave (open source variant of MATLAB) is a bit slower.
This is the main file that gets executed. The post processing isnt really done yet, but I guess if your capable of running the code you can adjust that to your own likings.
%% Procs
% Calculating Proc damage on direct damage abilities
dmg_FOR = round(FlamesOfRhuin{3}.*(1+OffMod).*(1-DefMod).*evalin('base',FlamesOfRhuin{5}));
dmg_FP = round(FunnelPower{3}.*(1+OffMod).*(1-DefMod).*evalin('base',FunnelPower{5}));
rate_FOR = rand(run,1) <= FlamesOfRhuin{8}; % Proc = 1, No Proc = 0
dmg_proc = rate_FOR.*dmg_FOR + dmg_FP;
% Domination proc on BW conquerer Set
thoughness_debuff(rand(run,1) <= 0.25) = 100;
So why am I posting this here? Well I hope at least one person looks at the code, catches an error and tells me . If no-one finds any bugs I will start to run some studies in the future and hopefully provide some well founded numbers.
Preliminary Results
Maybe as a preliminary result I can show you the average disrupt development of my BW with 7% disrupt strike through at 1050 Intelligence. Against a full conquerer AM with 576 Willpower + Max Deft Defender.
Picture Link
The Y-Axis shows the average disrupt rate after 1 million rotations. The X-Axis shows the disrupt checks each ability has to perform.
As can be seen in the picture the 306 willpower debuff on the boiling blood reduces the average disrupt rate by about 6%. However due to Reactionary Porc on the set the average disrupt rate continues to increase. The defense procs results for this rotation in a final increase of about 3% effective disrupt.
Edit: 2017-11-21: Changed the wording a bit; Added Sources and some Comments to the combat formulas section
Last edited by Cimba on Tue Nov 21, 2017 10:23 am, edited 3 times in total.
I thought about starting the result section of my little simulation with something that doesnt actually require the code described. Instead I want to start of with providing some graphs about the disrupt rates that we can currently encounter.
The effetive disrupt rate is to the best of my knowledge
<Disrupt Rate> = [<Defender Willpower>/((<Defender Level>*7.5+50)*7.5) + <Sum of disrupt bonus> - <Sum of % based strikethrough>]/[1+<Attacker Intelligence>/((<Attacker Level>*7.5+50)*7.5)]
When we set the attacker and defender level to 40 we can express this disrupt rate as a function of Willpower and Intelligence (and the additional values of disrupt and strikethrough). This gives us a surface graph with the disrupt rates.
Without any percentage based modifiers it looks like this
I think the average base willpower is somewhere around 150. This would provide about 5% against a 1050 intelligence attacker. When you soft cap willpower you would get about 30% disrupt against the same attacker.
A bit more realistic is that the attacker has some disrupt strike through and the defender at least some addtional disrupt from gear.
These percentage based modifiers act basically as offsets of surfrace shown in the first figure. With the addition that the disrupt rate (hopefully) cant go into negatives.
Now you can add all sorts of disrupt bonuses: Deft Defender, Hold The Line, Shielding Anger. This tops probably out with the Black Guard who can comfortably sit at 90% disrupt due to disrupt tactics and high value willpower buffs.
It was pointed out that you cant really see too much on the 3D plots. Which unforuntately appears to be true. So here a simple 2D plot of the disrupt gain rate with willpower. The different lines in the plot represent the amout of disrupt you got through items, tactics, deft defender etc.