[BW]Combat Simulations
Posted: Mon Nov 20, 2017 6:50 pm
Introduction
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
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.
Damage Calculation
<Damage> = [<Base Damage> + <Mastery Point Scaling> + <Stat Scale> * (<Intelligence>+<Magic Power>-<Thoughness>)/5]*(1-<Mitigation>)*(1+<Offensive Modifiers>)*(1-<Defensive Modifiers>)
<Crit Damage> = <Damage>*((<random(1.4,1.6)> + <Crit Damage Bonus>) * (1-<Crit Damage Reduction>))
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.
<Mitigation> = <Resistance>/(<Defender Level>*0.41902)/100
if Resistance > 672
<Mitigation> = <Resistance>/(<Defender Level>*1.2604 + 26.719)/100
Source
Defense
<Defense Stats> = <Defender Willpower>/((<Defender Level>*7.5+50)*7.5)
<Strikethrough Stats> = <Attacker Intelligence>/((<Attacker Level>*7.5+50)*7.5)
<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
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.
Spell Database. Well you need some input values if you want to get accurate results. Here is the test database I used to verify my code.
You also need some stats for your attacker and defender. These are for my BW and a full conq AM with winds of impervious set + beastlord.
I'm not entirely sure if my interpreation of the defensive mechanism is correct so I wrote it into a seperate file to modifier it easier.
File for offensive Procs. Since it want to test out different procs I also wrote into a seperate file. So I dont have to **** up my main file.
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
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
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.
Damage Calculation
<Damage> = [<Base Damage> + <Mastery Point Scaling> + <Stat Scale> * (<Intelligence>+<Magic Power>-<Thoughness>)/5]*(1-<Mitigation>)*(1+<Offensive Modifiers>)*(1-<Defensive Modifiers>)
<Crit Damage> = <Damage>*((<random(1.4,1.6)> + <Crit Damage Bonus>) * (1-<Crit Damage Reduction>))
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.
<Mitigation> = <Resistance>/(<Defender Level>*0.41902)/100
if Resistance > 672
<Mitigation> = <Resistance>/(<Defender Level>*1.2604 + 26.719)/100
Source
Defense
<Defense Stats> = <Defender Willpower>/((<Defender Level>*7.5+50)*7.5)
<Strikethrough Stats> = <Attacker Intelligence>/((<Attacker Level>*7.5+50)*7.5)
<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

- 1 million --> 4 seconds
- 10 million --> 60-90 seconds
- 1 billion --> MATLAB goes crazy
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.
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:

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