SublimeSparo wrote: »NightbladeMechanics wrote: »Proc sets weren't nerfed for pve.
As in they were nerfed because of pvp, or despite the nerf they aren't nerfed to the ground?
CaptainPocky wrote: »Good stuff, I always like seeing people that also actually enjoy this game's sometimes-crazy math. I haven't had the time to fully read through this thread yet, but I wanted to mention something just fyi.
On uptimes. For proc sets, a very easy-to-remember but useful equation you can derive from the binomial distribution is:
P = 1-(1-p)^n where p = Tooltip chance, n = Opportunities/sec (times 1 sec for the exponent units), and P = Proc chance/1sec
So for example BSW: You can show MagDKs do about 5.29 flame damage hits per second. This gives P = 69.3%, or average 1.4 seconds to proc. With a cooldown of 12s, that's a total period of 13.4s or an uptime of 8/13.4 = 59.5% -- approximately what I believe you found earlier. BSW in this sense is also what I call a "cooldown-limited set", e.g. even with only 1 opportunity per sec (like just throwing down a fire wall), the uptime only drops to 47.1%. Many sets in the game are like this. The sets that aren't (ex. Selene's: avg. proc time = 4.9s vs. CD = 4s) are usually balanced between proc time and CD.
Anyway, hopefully this helps you to speed up some calculations, if you didn't know it already.
(Note: Of course we have to be careful as to when the cooldown actually begins, because occasionally you'll find a set that doesn't actually begin the cooldown until the proc ends. If it were the case here, the uptime would only be 8/(8+12+1.4) = 37%, but I believe this type of effect is unintentional and has mostly been removed from the game.)
CaptainPocky wrote: »Also, I'm sure at one point while writing your spreadsheet you came to a realization that I had while writing my own -- it's a lot of pain just to obtain results specific only to one or two setups.
So I started thinking, "Hm. Wouldn't it be nice to have a program that with the click of a button would tell you your DPS and optimal Champ Point distribution with any specific setup by calculating everything from the ground up?" Thinking about it more, I realized that it wouldn't even be *too* hard to write! So I might do that. Or not if I'm lazy. The biggest challenges I see currently are:
1.) Finding a reliably updated list of data for each skill (e.g. in the "No buff" Tooltip Damage equation, DMG = (M+d*D)*r*x, what are the multipliers d (usually ~10.4) and x for each skill? Also, does the ability count as melee damage? Direct damage? Is it affected by Thaumaturge? Etc.), or doing it myself. Does anyone here know a good list?
2.) Making an interface that someone other than me could use. (I know how I'd code it up in Matlab or Java, but I have absolutely no experience with making an actual Java-based GUI haha)
When does the bonus ulti on enemy hit from shooting star get applied?
If I have shooting star on one bar, cast it, then swap bars before it lands do I still get the credit?
The binomial distribution in the way you use it is not the way to go in my opinion, and your results don't match the reality. BSW uptimes on a DK are at 62-64%. So let's check the calculation:
A binomial distribution could be used to calculate the probability of having one proc after one second, like you did I guess and you used that probability (69.3%) to calculate the average. But you you have to use the average based on the 20% chance of the binomial distribution with p=20% and n the number of fire ticks.
Average is defined as A = n * p.
Normalizing to seconds and using your 5.29 ticks per second we get:
A = 1.058 procs per second
So finally, it takes 1/A = 0.95 seconds to proc on average leading to an uptime of 8/(12+0.95)=61.7%. Wich is still too low, but closer.
I also thought about programming it but as you wrote the problem is to get all the coefficients for the different abilities including their global cooldowns. Even a perfect simulation would not match reality since a decent amount of dmg is done by weaving and player skill (perfect weaving, all dots perfectely refreshed, etc). All you can do here is to introduce a weaving coefficient that can be used to somehow simulate player skill, like I did in the spreadsheet.
The error from player skill will be bigger than the ability coefficient error you get by just taking a mean ability coefficient.
The perfect solution would be a real rotation simulation tool with an adjustable error rate, etc. but in that case it would be much easier to write a macro and let it perform the rotation in game automatically.
I actually finished programming a combat simulator. I wrote in Matlab and @Panth141 tried it out for a while. The rough idea I used is to create a priority cast list like
Shooting Star -> Blockade of Fire -> Force Pulse
And then put things on a periodic cast so you would only cast Blockade of Fire every 8 seconds. The interface is not well designed but works.
Skill coefficients are readily available. My error in damage calculation is usually within 5 points.
I have a basic stat page. Some of my inputs are a bit odd, I admit but its what I'm used to from my spreadsheets.
The second tab allows you to put your abilities in a priority. The script tries to pick the first castable skill from the list. Once it's cast the ability is not allowed to be cast for time, t_Period. The execute time, t_Execute, is the global cooldown. There is an option to LA weave with that skill or not. min health and max health are used to control when an ability can be casted. So I would put max health = 0.2 to start casting Mages Wrath at 20% for example. I haven't implemented SD yet for reasons that will soon become obvious but my intention was that would pick a number from a standard deviation to add to t_Period to simulate errors in rotation.
To the right there are periodic buffs and debuffs. In the example picture, a magicka potion (with Major Sorcery) is drank every 45 seconds starting at 0 seconds. The bottom is just target stats and where to save files.
The third tab outputs a single damage parse. You have a damage log and a damage summary. There are some buttons to open up graphs that plots your stats.
The final tab aggregates all the simulations and calculates statistics. Again there are some buttons to make plots of stats.
I'm pretty happy with it so far. I can simulate most commonly encountered DPS abilities. An excel spreadsheet of abilities I can simulate right now can be found here.
So I've been thinking of what I want to simulate and just messing around with convergence and simulation time. Below is a quick summary of my convergence and time test so far
Slimecraw simulations take about 7 seconds each while Bloodspawn takes around 39. Time taken should be linear to target health. Convergence is achieved in only 10 simulations! That surprised me a lot. But as expected, standard deviation scales as sqrt( Health) thus the standard deviation of Bloodspawn is ~ sqrt(5) smaller than Slimecraw.
In the images of my combat simulator above you might notice that for that particular simulation I predict a mean DPS of 40254 with a SD of 492. That's 1.2% which is a bit on the large side since some of the effects of interest are smaller than that. And those simulations initially took around 15 minutes. But then I use parallel computing in matlab and got them down to 6 ish minutes. I would ideally want a SD of 200 (at 40k DPS) so I would need the target health to be around 50 million which means each simulation would take 30 ish minutes. I was hoping to run simulations in the 5 - 15 minutes duration. (I don't like waiting ...) So this is why I haven't messed around with adding a standard deviation to t_Period. As an aside, I'm using a Core i5-3570k.
Slightly back on topic, I have two options for simulating Moondancer, which are already implemented, one is a smart synergiser which only synergises when you don't have the spell damage buff and another random synergiser which as the name suggest synergises every synergy. The number of available synergies is dictated by a periodic buff called 'Synergy' (panel 2)
So overall I find that while the simulation is nice, in order to get a nice low SD the simulation time has to be quite long. Perhaps I have to just deal with it and accept that things will take long and create batch simulation files before I sleep or something.
If you want to use the simulator feel free to PM me, I can compile it into a Windows executable. I don't have a Mac with Matlab so I can't compile to a Mac environment.
NightbladeMechanics wrote: »Proc sets weren't nerfed for pve.
Just because the nerf was intended to change the state of PvP, it doesn't change the fact that it will ultimately affect PvE the most. That's the name of the game, when it comes to ESO nerfs. ZOS tries to fix something in PvP ---> *** over PvE in the process and somehow PvP doesn't change much.
Hi @GilGalad !
4) Bonus test: are the above passives additive or multiplicative with execute bonuses? Given that the execute bonus typically fits into the base damage calculation pre-modifier, I would expect it to be multiplicative - but you never know with ZoS. I can test this myself on PTS, but it'd be nice to have a second person test, too!
non crit Basse: 12574 minor slayer: 12731, 1,25% minor berserk : 12825, 2,00% minor slayer + minor berserk: 12982, 3,24% Staff passive: 12825, 2,00% minor slayer + Staff: 12982, 3,24% MS + MB + Staff: 13233, 5,24%All data can be found in the experiments tab in the Spreadsheet.
I did think of adding an error rate to LA but I was so worried my standard deviations would increase I removed it XD
For the unusual sets, I have implemented the following so far
- Scathing Mage - only procs of direct damage and all ticks of Twisting Path (in game it can proc off the first tick of all DoTs)
- Burning Spellweave
- Silks of the Sun
- Moondancer Smart - only synergises if you don't have the spell damage buff
- Moondancer Random - synergises all the time
The simulations you listed are possible at the moment
I actually finished programming a combat simulator. I wrote in Matlab and @Panth141 tried it out for a while. The rough idea I used is to create a priority cast list like
Shooting Star -> Blockade of Fire -> Force Pulse
And then put things on a periodic cast so you would only cast Blockade of Fire every 8 seconds. The interface is not well designed but works.
Skill coefficients are readily available. My error in damage calculation is usually within 5 points.
I have a basic stat page. Some of my inputs are a bit odd, I admit but its what I'm used to from my spreadsheets.
The second tab allows you to put your abilities in a priority. The script tries to pick the first castable skill from the list. Once it's cast the ability is not allowed to be cast for time, t_Period. The execute time, t_Execute, is the global cooldown. There is an option to LA weave with that skill or not. min health and max health are used to control when an ability can be casted. So I would put max health = 0.2 to start casting Mages Wrath at 20% for example. I haven't implemented SD yet for reasons that will soon become obvious but my intention was that would pick a number from a standard deviation to add to t_Period to simulate errors in rotation.
To the right there are periodic buffs and debuffs. In the example picture, a magicka potion (with Major Sorcery) is drank every 45 seconds starting at 0 seconds. The bottom is just target stats and where to save files.
The third tab outputs a single damage parse. You have a damage log and a damage summary. There are some buttons to open up graphs that plots your stats.
The final tab aggregates all the simulations and calculates statistics. Again there are some buttons to make plots of stats.
I'm pretty happy with it so far. I can simulate most commonly encountered DPS abilities. An excel spreadsheet of abilities I can simulate right now can be found here.
So I've been thinking of what I want to simulate and just messing around with convergence and simulation time. Below is a quick summary of my convergence and time test so far
Slimecraw simulations take about 7 seconds each while Bloodspawn takes around 39. Time taken should be linear to target health. Convergence is achieved in only 10 simulations! That surprised me a lot. But as expected, standard deviation scales as sqrt( Health) thus the standard deviation of Bloodspawn is ~ sqrt(5) smaller than Slimecraw.
In the images of my combat simulator above you might notice that for that particular simulation I predict a mean DPS of 40254 with a SD of 492. That's 1.2% which is a bit on the large side since some of the effects of interest are smaller than that. And those simulations initially took around 15 minutes. But then I use parallel computing in matlab and got them down to 6 ish minutes. I would ideally want a SD of 200 (at 40k DPS) so I would need the target health to be around 50 million which means each simulation would take 30 ish minutes. I was hoping to run simulations in the 5 - 15 minutes duration. (I don't like waiting ...) So this is why I haven't messed around with adding a standard deviation to t_Period. As an aside, I'm using a Core i5-3570k.
Slightly back on topic, I have two options for simulating Moondancer, which are already implemented, one is a smart synergiser which only synergises when you don't have the spell damage buff and another random synergiser which as the name suggest synergises every synergy. The number of available synergies is dictated by a periodic buff called 'Synergy' (panel 2)
So overall I find that while the simulation is nice, in order to get a nice low SD the simulation time has to be quite long. Perhaps I have to just deal with it and accept that things will take long and create batch simulation files before I sleep or something.
If you want to use the simulator feel free to PM me, I can compile it into a Windows executable. I don't have a Mac with Matlab so I can't compile to a Mac environment.
Edit:
SD - standard deviation
And for those who want some graphical representation of the results from the 4th panel. It's an older simulation thus the lower numbers but it shows a histogram of total DPS for 100 simulations and histograms for the top 9 damage dealing abilities. The top right shows the name and percentage contribution.