Jump to content

DPS Calculation of 2.0 relics & C++simulation code gratis!


X-Boson

Recommended Posts

Updated for 2.4

 

I´ve calculated and simulated the DPS boost from SWTOR relics.

 

This post is for everyone who has fun in theorycrafting and programming. Surely as well for people who want to make sure they are BiS. I´ll be glad to give you further explanation about the formulas or simulation code on demand. But it will not help if you "hate" maths and try to argue with normal "human intellect" instead of data and facts.

 

[1]DPS of dmg-spike autoproc

 

You have a chance to proc additional dmg on each hit, whereby after each proc your chance will be locked for a while. How can I calculate my DPS boost from this dmg-spike autoproc?

 

First of all, you need to find out your total proc number after many on-hits. Assumed you had N total hits on your target (strikes, DoTs, every kind of dmg-popout). Let p be the chance of proc on each hit, ε the locktime and f the hit frequency, thus the total autoproc number n after N hits is given by

 

n = p*N / (1+p*ε*f)

 

Say we have proc-chance p = 30% and locktime ε=4.5sec, just as given in dmg relic´s tooltip. After 500 on-hits on target with 2 hits/sec (that will be a 4min fight) you can expect round 41 autoprocs. This formula is originally derivated from detector metrology considering the "deadtime". Because a detector is after each record not able to process further events for a short time (check deadtime/Non-paralyzable analysis on wiki). In the formula fight duration T was converted into N/f. In other words proc number n can also be expressed by p*N / (1+p*ε*N/T). Someone might doubt that using a average hit-frequency is not realistic. Because in one sec he hits far above average and in next second his hits missed. No worries, I ensure you this is fine. This formula itself is based on this kind of hit-distribution (aka poission distribution). All you have to know is your overall hit number and fight duration. Once I confirmed the formula of proc-number(first one) ingame using swmonitor(meanwhile website down). That can show you your total number of hits/misses and number of procs over a fight. To calculate the DPS increase ΔDPS, simply divide proc number n by fight duration T(which is N/f as mentioned):

 

ΔDPS = 0.3*f / (1+0.3*4.5*f)*(1+yourcrit*yoursurge)*procdmg

 

In this formula you can multiply any larger procdmg to have your DPS increase. Insert fight duration T instead of hit frequency f =N/T, ΔDPS can also be expressed by ΔDPS = p*N / [T*(1+p*ε*N/T)]*(1+yourcrit*yoursurge)*procdmg Since proc dmg can crit, you have to additionally consider the factor (1+yourcrit*yoursurge). Thats the way to calculate your expected DPS. "Yourcrit" and "Yoursurge" are both decimal. If your crit-chance is 30%, then "yourcrit" is 0.3 in the formula. And if your crit-dmg is 1.7 times of your normal dmg, then "yoursurge" is 0.7.

 

As example I plotted DPS increase from 1 proc-dmg as a function of hit frequency regardless of any crit-chance. You can check it here http://imageshack.us/f/534/procdps.png/

 

 

 

 

[2] DPS of power boost autoproc

 

The ΔDPS formula of relic gives you a chance to gain X power for 6sec every ε=20sec is given by:

 

ΔDPS = 6*0.3*f / (1+0.3*20*f)*ΔDPS(from X power)

 

Whereby "ΔDPS(from X power)" is your DPS increase (boost) through X power. How much this is depends on your individual rotation which can be found using simulator. I would make a rough estimate that 1 power increases DPS up to 0.4. The term "(1+yourcrit*yoursurge)" is already contained in "ΔDPS(from X power)". Apart from these terms, you have the factor "6" in formula gives you a power boost for 6 second.

 

 

 

 

[3] DPS of pri statproc

 

 

Analogous to powerproc, the ΔDPS formula of relic gives you a chance to gain X pri stats for 12sec every ε=40sec is given by:

 

ΔDPS = 12*0.3*f / (1+0.3*40*f)*ΔDPS(from X pri stats)

 

 

 

 

[4] DPS of powerclick boost

 

ΔDPS from relic using powerclick boost, like 30sec boost for 2min CD is given by:

 

ΔDPS = m*30/T*ΔDPS(from X power)

 

Whereby T is the fight duration and should be converted into sec during calculation. m is the total number of self-activationswhich is given by m=T/120sec (calculate in sec). Keep in mind you can only then activate your boost again, if 2min CD is up. Say if a fight takes about 2,5min(150sec), then you can use the boost up to two times. In that case m=150/120=1.25, round it up to two activations. If a fight takes 1.9min, then you can only use it once.

 

 

 

 

 

 

 

[5] Now which are BiS relics?

 

 

Bis relics taking account of "2.4 bug"

 

Classes with passive healing:

 

1st: KD powerproc

 

2nd: DF powerproc = pri stats

3rd: DF powerclick

 

 

 

Classes without passive healing:

 

1st: DF powerproc

 

2nd: DF pri stats

3rd: DF powerclick

 

 

You are welcome to use these spreadsheets for your own spec! Combat log upload on torparse is required! All to do is to input some numbers. You can find your heal hits under "Heals Given". Input " 0" at Total heal hits, if you dont have any heal there.

 

 

Spreadsheet "bugged" 2.4: DPS boost with / without passive healing :

https://docs.google.com/spreadsheet/ccc?key=0Ah1yO39E99OmdGxJZlFVQy1KVkVEUVZGVXViYUFQdWc&usp=drive_web#gid=0

 

 

Spreadsheet pre-2.4 (combat length fixed at 4 or 4.5min):

https://docs.google.com/spreadsheet/ccc?key=0Ah1yO39E99OmdEJtTFI3ZlUycXFJZ3dRV1l1bF9aaGc#gid=0

 

 

 

 

 

DPS/HPS lookup of pre-2.4 relics

 

 

assumed 1power=0.33DPS, 2.5hits/sec, 30%crit and 70% crit-multiplier, fight duration 4 or 4.5min

 

 

Dread guard internal/elemental (210 dmg-spike, 30% chance, 4.5sec uptime, +47power): 59, 64 with +12% dmg in watchman/annihilation

Dread guard energy/kinetic (280 dmg, 30%, 4.5sec, +47power): 53 on boss, 56 with 20% arm-redu, 64 with 20%-redu+marau/sent mid tree

Dread guard power click (+350power for 30sec, 2min CD, +47power): 44 to 54

Dread guard heal (505 heal over 3sec, 50% chance, 20sec uptime, +47power): 45

 

 

Arkanian internal/elemental (241 dmg-spike, 30% chance, 4.5sec uptime, +29power): 60, 66 with +12% dmg in watchman/annihilation

Arkanian energy/kinetic (322 dmg, 30%, 4.5sec, +29power): 53 on boss, 56 with 20% arm-redu, 65 with 20%-redu+marau/sent mid tree

Arkanian power click (+395power for 30sec, 2min CD, +29power): 42 to 53

Arkanian heal (580 heal over 3sec, 50% chance, 20sec uptime, +29power): 43

 

 

Underworld power boost (550power for 6sec, 30% chance, 20sec uptime, +32power): 62

Underworld internal/elemental (264 dmg-spike, 30% chance, 4.5sec uptime, +32power): 65, 72 with +12% dmg in watchman/annihilation

Underworld energy/kinetic (352 dmg, 30%, 4.5sec, +32power): 58 on boss, 62 with 20% arm-redu, 71 with 20%-redu+marau/sent mid tree

Underworld power click (+425power for 30sec, 2min CD, +32power): 46 to 57

Underworld heal (634 heal over 3sec, 50% chance, 20sec uptime, +32power): 47

 

 

 

Partisan power boost (410power for 6sec, 30% chance, 20sec uptime, +18power): 44

Partisan internal/elemental (190 dmg-spike, 30% chance, 4.5sec uptime, +18power): 45, 50 with +12% dmg in watchman/annihilation

Partisan energy/kinetic (254 dmg, 30%, 4.5sec, +18power): 40 on boss, 43 with 20%-redu, 50 with 20%-redu+marau/sent mid tree

Partisan heal (457 heal over 3sec, 50% chance, 20sec uptime, +18power): 33

 

 

Conqueror power boost (435power for 6sec, 30% chance, 20sec uptime, +20power): 47

Conqueror internal/elemental (202 dmg-spike, 30% chance, 4.5sec uptime, +20power): 49, 54 with +12% dmg in watchman/annihilation

Conqueror energy/kinetic (269 dmg, 30%, 4.5sec, +20power): 43 on boss, 46 with 20%-redu, 53 with 20%-redu+marau/sent mid tree

Conqueror heal (484 heal over 3sec, 50% chance, 20sec uptime, +20power): 35

 

 

 

assumed 1power=0.35DPS, 2.5hits/sec, 30%crit and 70% crit-multiplier, fight duration 4 or 4.5min

 

 

Dread guard internal/elemental (210 dmg-spike, 30% chance, 4.5sec uptime, +47power): 60, 65 with +12% dmg in watchman/annihilation

Dread guard energy/kinetic (280 dmg, 30%, 4.5sec, +47power): 54 on boss, 57 with 20% arm-redu, 65 with 20%-redu+marau/sent mid tree

Dread guard power click (+350power for 30sec, 2min CD, +47power): 47 to 57

Dread guard heal (505 heal over 3sec, 50% chance, 20sec uptime, +47power): 46

 

 

Arkanian internal/elemental (241 dmg-spike, 30% chance, 4.5sec uptime, +29power): 60, 66 with +12% dmg in watchman/annihilation

Arkanian energy/kinetic (322 dmg, 30%, 4.5sec, +29power): 54 on boss, 57 with 20% arm-redu, 65 with 20%-redu+marau/sent mid tree

Arkanian power click (+395power for 30sec, 2min CD, +29power): 45 to 56

Arkanian heal (580 heal over 3sec, 50% chance, 20sec uptime, +29power): 44

 

 

Underworld power boost (550power for 6sec, 30% chance, 20sec uptime, +32power): 65

Underworld internal/elemental (264 dmg-spike, 30% chance, 4.5sec uptime, +32power): 66, 73 with +12% dmg in watchman/annihilation

Underworld energy/kinetic (352 dmg, 30%, 4.5sec, +32power): 59 on boss, 62 with 20% arm-redu, 72 with 20%-redu+marau/sent mid tree

Underworld power click (+425power for 30sec, 2min CD, +32power): 48 to 61

Underworld heal (634 heal over 3sec, 50% chance, 20sec uptime, +32power): 48

 

 

 

Partisan power boost (410power for 6sec, 30% chance, 20sec uptime, +18power): 47

Partisan internal/elemental (190 dmg-spike, 30% chance, 4.5sec uptime, +18power): 46, 50 with +12% dmg in watchman/annihilation

Partisan energy/kinetic (254 dmg, 30%, 4.5sec, +18power): 41 on boss, 43 with 20%-redu, 50 with 20%-redu+marau/sent mid tree

Partisan heal (457 heal over 3sec, 50% chance, 20sec uptime, +18power): 33

 

 

Conqueror power boost (435power for 6sec, 30% chance, 20sec uptime, +20power): 50

Conqueror internal/elemental (202 dmg-spike, 30% chance, 4.5sec uptime, +20power): 49, 54 with +12% dmg in watchman/annihilation

Conqueror energy/kinetic (269 dmg, 30%, 4.5sec, +20power): 43 on boss, 46 with 20%-redu, 53 with 20%-redu+marau/sent mid tree

Conqueror heal (484 heal over 3sec, 50% chance, 20sec uptime, +20power): 35

 

 

 

assumed 1power=0.38DPS, 2.5hits/sec, 30%crit and 70% crit-multiplier, fight duration 4 or 4.5min

 

 

Dread guard internal/elemental (210 dmg-spike, 30% chance, 4.5sec uptime, +47power): 61, 67 with +12% dmg in watchman/annihilation

Dread guard energy/kinetic (280 dmg, 30%, 4.5sec, +47power): 56 on boss, 58 with 20% arm-redu, 66 with 20%-redu+marau/sent mid tree

Dread guard power click (+350power for 30sec, 2min CD, +47power): 51 to 62

Dread guard heal (505 heal over 3sec, 50% chance, 20sec uptime, +47power): 47

 

 

Arkanian internal/elemental (241 dmg-spike, 30% chance, 4.5sec uptime, +29power): 61, 67 with +12% dmg in watchman/annihilation

Arkanian energy/kinetic (322 dmg, 30%, 4.5sec, +29power): 54 on boss, 58 with 20% arm-redu, 66 with 20%-redu+marau/sent mid tree

Arkanian power click (+395power for 30sec, 2min CD, +29power): 49 to 61

Arkanian heal (580 heal over 3sec, 50% chance, 20sec uptime, +29power): 45

 

 

Underworld power boost (550power for 6sec, 30% chance, 20sec uptime, +32power): 71

Underworld internal/elemental (264 dmg-spike, 30% chance, 4.5sec uptime, +32power): 67, 73 with +12% dmg in watchman/annihilation

Underworld energy/kinetic (352 dmg, 30%, 4.5sec, +32power): 60 on boss, 63 with 20% arm-redu, 73 with 20%-redu+marau/sent mid tree

Underworld power click (+425power for 30sec, 2min CD, +32power): 53 to 66

Underworld heal (634 heal over 3sec, 50% chance, 20sec uptime, +32power): 49

 

 

 

Partisan power boost (410power for 6sec, 30% chance, 20sec uptime, +18power): 51

Partisan internal/elemental (190 dmg-spike, 30% chance, 4.5sec uptime, +18power): 46, 51 with +12% dmg in watchman/annihilation

Partisan energy/kinetic (254 dmg, 30%, 4.5sec, +18power): 41 on boss, 44 with 20%-redu, 50 with 20%-redu+marau/sent mid tree

Partisan heal (457 heal over 3sec, 50% chance, 20sec uptime, +18power): 33

 

 

Conqueror power boost (435power for 6sec, 30% chance, 20sec uptime, +20power): 54

Conqueror internal/elemental (202 dmg-spike, 30% chance, 4.5sec uptime, +20power): 50, 55 with +12% dmg in watchman/annihilation

Conqueror energy/kinetic (269 dmg, 30%, 4.5sec, +20power): 44 on boss, 47 with 20%-redu, 54 with 20%-redu+marau/sent mid tree

Conqueror heal (484 heal over 3sec, 50% chance, 20sec uptime, +20power): 36

 

 

 

assumed 1power=0.40DPS, 2.5hits/sec, 30%crit and 70% crit-multiplier, fight duration 4 or 4.5min

 

 

Dread guard internal/elemental (210 dmg-spike, 30% chance, 4.5sec uptime, +47power): 62, 68 with +12% dmg in watchman/annihilation

Dread guard energy/kinetic (280 dmg, 30%, 4.5sec, +47power): 57 on boss, 59 with 20% arm-redu, 67 with 20%-redu+marau/sent mid tree

Dread guard power click (+350power for 30sec, 2min CD, +47power): 54 to 66

Dread guard heal (505 heal over 3sec, 50% chance, 20sec uptime, +47power): 48

 

 

Arkanian internal/elemental (241 dmg-spike, 30% chance, 4.5sec uptime, +29power): 62, 68 with +12% dmg in watchman/annihilation

Arkanian energy/kinetic (322 dmg, 30%, 4.5sec, +29power): 55 on boss, 58 with 20% arm-redu, 67 with 20%-redu+marau/sent mid tree

Arkanian power click (+395power for 30sec, 2min CD, +29power): 51 to 64

Arkanian heal (580 heal over 3sec, 50% chance, 20sec uptime, +29power): 45

 

 

Underworld power boost (550power for 6sec, 30% chance, 20sec uptime, +32power): 75

Underworld internal/elemental (264 dmg-spike, 30% chance, 4.5sec uptime, +32power): 68, 74 with +12% dmg in watchman/annihilation

Underworld energy/kinetic (352 dmg, 30%, 4.5sec, +32power): 60 on boss, 64 with 20% arm-redu, 73 with 20%-redu+marau/sent mid tree

Underworld power click (+425power for 30sec, 2min CD, +32power): 55 to 69

Underworld heal (634 heal over 3sec, 50% chance, 20sec uptime, +32power): 50

 

 

 

Partisan power boost (410power for 6sec, 30% chance, 20sec uptime, +18power): 53

Partisan internal/elemental (190 dmg-spike, 30% chance, 4.5sec uptime, +18power): 47, 51 with +12% dmg in watchman/annihilation

Partisan energy/kinetic (254 dmg, 30%, 4.5sec, +18power): 41 on boss, 44 with 20%-redu, 51 with 20%-redu+marau/sent mid tree

Partisan heal (457 heal over 3sec, 50% chance, 20sec uptime, +18power): 34

 

 

Conqueror power boost (435power for 6sec, 30% chance, 20sec uptime, +20power): 57

Conqueror internal/elemental (202 dmg-spike, 30% chance, 4.5sec uptime, +20power): 50, 55 with +12% dmg in watchman/annihilation

Conqueror energy/kinetic (269 dmg, 30%, 4.5sec, +20power): 44 on boss, 47 with 20%-redu, 54 with 20%-redu+marau/sent mid tree

Conqueror heal (484 heal over 3sec, 50% chance, 20sec uptime, +20power): 36

 

 

 

assumed 1power=0.42DPS, 2.5hits/sec, 30%crit and 70% crit-multiplier, fight duration 4 or 4.5min

 

 

Dread guard internal/elemental (210 dmg-spike, 30% chance, 4.5sec uptime, +47power): 63, 69 with +12% dmg in watchman/annihilation

Dread guard energy/kinetic (280 dmg, 30%, 4.5sec, +47power): 57 on boss, 60with 20% arm-redu, 68 with 20%-redu+marau/sent mid tree

Dread guard power click (+350power for 30sec, 2min CD, +47power): 56 to 69

Dread guard heal (505 heal over 3sec, 50% chance, 20sec uptime, +47power): 49

 

 

Arkanian internal/elemental (241 dmg-spike, 30% chance, 4.5sec uptime, +29power): 62, 68 with +12% dmg in watchman/annihilation

Arkanian energy/kinetic (322 dmg, 30%, 4.5sec, +29power): 56 on boss, 59 with 20% arm-redu, 68 with 20%-redu+marau/sent mid tree

Arkanian power click (+395power for 30sec, 2min CD, +29power): 54 to 67

Arkanian heal (580 heal over 3sec, 50% chance, 20sec uptime, +29power): 46

 

 

Underworld power boost (550power for 6sec, 30% chance, 20sec uptime, +32power): 78

Underworld internal/elemental (264 dmg-spike, 30% chance, 4.5sec uptime, +32power): 68, 75 with +12% dmg in watchman/annihilation

Underworld energy/kinetic (352 dmg, 30%, 4.5sec, +32power): 61 on boss, 64 with 20% arm-redu, 74 with 20%-redu+marau/sent mid tree

Underworld power click (+425power for 30sec, 2min CD, +32power): 58 to 73

Underworld heal (634 heal over 3sec, 50% chance, 20sec uptime, +32power): 50

 

 

 

Partisan power boost (410power for 6sec, 30% chance, 20sec uptime, +18power): 56

Partisan internal/elemental (190 dmg-spike, 30% chance, 4.5sec uptime, +18power): 47, 52 with +12% dmg in watchman/annihilation

Partisan energy/kinetic (254 dmg, 30%, 4.5sec, +18power): 42 on boss, 44 with 20%-redu, 51 with 20%-redu+marau/sent mid tree

Partisan heal (457 heal over 3sec, 50% chance, 20sec uptime, +18power): 34

 

 

Conqueror power boost (435power for 6sec, 30% chance, 20sec uptime, +20power): 60

Conqueror internal/elemental (202 dmg-spike, 30% chance, 4.5sec uptime, +20power): 50, 55 with +12% dmg in watchman/annihilation

Conqueror energy/kinetic (269 dmg, 30%, 4.5sec, +20power): 45 on boss, 47 with 20%-redu, 55 with 20%-redu+marau/sent mid tree

Conqueror heal (484 heal over 3sec, 50% chance, 20sec uptime, +20power): 37

 

 

 

 

 

 

[6] Simulation of hit autoproc

 

 

I created a C++ simulation to calculate number of autoprocs and thus the increase in DPS(just for fun). Actually this is generally designed for all kinds of proc stuff which have an internal locktime. So you may use it in any other game as well. By inputting parameters like proc-chance, proc-dmg, proc-locktime you will have your overall number of procs or DPS increase as output, depending on your average hit frequency. ABSOLUTELY no need to check or understand anything in the code to use this simulation. You can run this script for your individual purpose online after a half-minute registration on http://ideone.com/account/register. No worries, ideone is absolutely a free-to-use for programming, only email, username and password are required. After registration click "new code" on the top right corner and "choose language" C++11 in the list downleft, then click on button "ideone it" (run it under private or user, if u dont want to see it listed under recent new code in public). Use "edit" to make further parameter changes.

 

Now asumed you have 23.45% crit and 75.79% surge(crit-size) and the following goodness:

 

 

You have a 30% chance to gain 1 proc-dmg on each hit once every 4.5sec.

 

Here the source code

 

#include <iostream>
#include <random>
#include <iomanip>
#include <stdio.h>
#include <math.h>

//rounding mechanism
   int rounding(float a){
    if((a-int(a))<0)a=int(a);
    if((a-int(a))>=0.5)a=int(a+1);
   return a;}

using namespace std;


int main()
{

   const int procdmg = 1; //input non-crit procdmg on target (not exactly tooltip value because of armor & resist!)
   const float yourcrit = 23.45; //input your crit-chance in %
   const float yoursurge = 75.79; //input your magnitude of crit-dmg (surge rating) in %

       const int nhits = 800 ;     //input number of on-hits on target
       const int ntests = 500 ; //input number of simulations
       const float procchance = 30 ; //input procentage procchance
       const float locktime = 4.5 ; //input locktime in second after each proc



       random_device rnd;
       mt19937 generator(rnd()); 
       bernoulli_distribution distribution(procchance/100);

   cout << "Simulation of DPS increase from relic´s autoproc in SWTOR 2.0 \n\n" ;

   cout << procchance << "% chance to have "<<procdmg
   <<" procdmg each hit with a locktime of 4.5 second\n\n" ;
   cout<<"  simulate DPS dependent on hitfrequency: \n\n" ;

   cout<< "   -->hit "<< nhits << " times in all and " << ntests << " times simulations for each hitfrequency \n\n\n";

   for( float hitfrequency = 1.0 ; hitfrequency <= 5.0 ; hitfrequency += 0.5 ){

       cout << '\n' ;
        float sum=0;

       float average=0;
       float sumdev=0;
       float stddev=0;
       float numb[ntests]={0};

       for( int i = 1 ; i <= ntests ; i++ )
       {


             float procnumber=0;

            for( int k=1 ; k <= nhits ; k++ ){



                int count=0;

                   for(int j=1 ; j <= nhits ; j++ ){
                        if( distribution(generator))
                           count++;


                        if(count==1){
                         count=j+hitfrequency*locktime;
                        }

                        if(count>1) break;

                   }


               procnumber++;
               k+=count-1;

            if(k>(nhits-procnumber*(hitfrequency*locktime-int(hitfrequency*locktime))))break;


        } //nhits loop ends

               cout << fixed << setprecision(2);


               numb[i-1]=procnumber;
               sum+=procnumber;
               average=sum/ntests;


       } //ntest loop ends


           for( int i = 1 ; i <= ntests ; i++ ){     
            sumdev+=(average-numb[i-1])*(average-numb[i-1]);
            stddev=sqrt(sumdev/(ntests-1));
           }

       cout<< " Average number of procs with " <<hitfrequency <<" hits/sec is " <<rounding(average) << " after "<<nhits<<" hits (fight duration "<< nhits/hitfrequency/60 <<"min) \n" ;
       cout<< "  (overall "<<average/nhits*100<< "% procs with standard deviation "
       << stddev/average*100<< "%, 95.4% messured numbers within "<<rounding(average)<<"±"<<rounding(2*stddev)<< ") \n\n" ;
       cout << "     =>DPS increase with " <<hitfrequency <<   " hits/sec is "<< fixed << setprecision(3)
       << (1+yourcrit/100*yoursurge/100)*average*hitfrequency/nhits*procdmg << '\n' ;
       cout << "\n\n" ;
   } //hitfrequency loop ends
}

 

The numbers at "const int/float parameter = a number to input " at the beginning are the parameters you can change. Text behind two slashes "//" are comments I made (just like "input your blah blah here"). They are not part of active code. In the code parameter "procdmg" is set to 1 (more exactly at line "const int procdmg = 1"), "yourcrit" is 23.45%, "yoursurge" is 75.79%, "procchance" 30% each hit and "locktime" 4.5sec. I set procdmg to "1" just as standard dmg-unit, so you can multiply the outcoming number with any larger proc dmg later. Since proc can crit, you have to consider your crit and crit size to calculate average DPS increase. Besides you can modify further parameters like "procchance" or "locktime" for other relics (i.e. healer relic 50% procchance and 20 sec locktime). Parameters "nhits" and "ntests" are for good statistic. The higher the number the more stable the result (...and the longer the run time ofc, anyway it was set up to 5sec). Close to reality the overall on-hit number "nhits" was set to 800. With 1.0 hit/sec that will be a 13min fight. Whereby you will finish 800 hits with 2.5 hits/sec in about 5min. Again there is no need to input fight duration here. This parameter was converted into total hit number "nhits" divided by "hitfrequency"(because hitfrequency is nhits/duration). After running the code, you should see the following output as result (no reason for compilation fail)

 

Simulation of DPS increase from relic´s autoproc in SWTOR 2.0

30% chance to have 1 procdmg each hit with a locktime of 4.5 second

 simulate DPS dependent on hitfrequency:

  -->hit 800 times in all and 500 times simulations for each hitfrequency



Average number of procs with 1.00 hits/sec is 103 after 800 hits (fight duration 13.33min)
 (overall 12.84% procs with standard deviation 3.74%, 95.4% messured numbers within 103±8)

    =>DPS increase with 1.00 hits/sec is 0.151



Average number of procs with 1.50 hits/sec is 80 after 800 hits (fight duration 8.89min)
 (overall 9.99% procs with standard deviation 3.11%, 95.4% messured numbers within 80±5)

    =>DPS increase with 1.50 hits/sec is 0.177



Average number of procs with 2.00 hits/sec is 65 after 800 hits (fight duration 6.67min)
 (overall 8.15% procs with standard deviation 2.97%, 95.4% messured numbers within 65±4)

    =>DPS increase with 2.00 hits/sec is 0.192



Average number of procs with 2.50 hits/sec is 55 after 800 hits (fight duration 5.33min)
 (overall 6.93% procs with standard deviation 2.62%, 95.4% messured numbers within 55±3)

    =>DPS increase with 2.50 hits/sec is 0.204



Average number of procs with 3.00 hits/sec is 48 after 800 hits (fight duration 4.44min)
 (overall 6.00% procs with standard deviation 2.48%, 95.4% messured numbers within 48±2)

    =>DPS increase with 3.00 hits/sec is 0.212



Average number of procs with 3.50 hits/sec is 42 after 800 hits (fight duration 3.81min)
 (overall 5.31% procs with standard deviation 2.28%, 95.4% messured numbers within 42±2)

    =>DPS increase with 3.50 hits/sec is 0.219



Average number of procs with 4.00 hits/sec is 38 after 800 hits (fight duration 3.33min)
 (overall 4.76% procs with standard deviation 2.25%, 95.4% messured numbers within 38±2)

    =>DPS increase with 4.00 hits/sec is 0.224



Average number of procs with 4.50 hits/sec is 34 after 800 hits (fight duration 2.96min)
 (overall 4.31% procs with standard deviation 2.21%, 95.4% messured numbers within 34±2)

    =>DPS increase with 4.50 hits/sec is 0.228



Average number of procs with 5.00 hits/sec is 31 after 800 hits (fight duration 2.67min)
 (overall 3.94% procs with standard deviation 2.08%, 95.4% messured numbers within 31±1)

    =>DPS increase with 5.00 hits/sec is 0.232

 

As you can see in output, I varied hitfrequency from 1.0 up to 5.0 per second each time in 0.5 step. Surely you can change it in any other scope at line "for( float hitfrequency = 1.0 ; hitfrequency <= 5.0 ; hitfrequency += 0.5 ){". Notice the average number of procs decreases with hit frequency because of less time, while DPS increases. This is logic and correct. Just imagine you break fight duration into many 4.5sec locktime intervals. By hitting fast you will have a better chance to gain a proc during 4.5sec before next interval starts (otherwise a interval is wasted). Each time after a proc there will be a locktime. With 5hits/sec there were 31 in the simulation, so 31*4.5sec = 2.3min which is used for proc. This is about 87% of fight duration. With 1.0hit/sec total locked time is about 58% of fight duration. In other words proc occurred less often here. "Standard deviation" is a measure privides the fluctuation of the achieved procs around its average value (i.e.103±8). In other words the less the deviation the more total proc numbers from each simulation are around their average value.

 

Now let´s compare the simulated result with the maths formula given at the beginning. First lets see the total number of procs n . Consider hitfrequency = 1.5, the proc number is theoretically 0.3*800/(1+0.3*4.5*1.5) = 79. Whereby average value listed in output above is 80. Thats very close. Now lets see DPS increase from 1 proc dmg. With 1.5 hit/sec and 23,45% crit and 75,79% surge, you should theoretically have 0.3*1.5/(1+0.3*4.5*1.5)*(1+0.2345*0.7579) = 0.175 increase in DPS for each procdmg. Whereby the simulated average value is 0.177. At this point you are welcome to do more checks using the powerful online calculator wolfram alpha. I have already input the DPS formula of the last calculation inside here: http://www.wolframalpha.com/input/?i=0.3*1.5+%2F+%281%2B0.3*4.5*1.5%29*%281%2B0.2345*0.7579%29

 

Maths or Simulation? Which one to take?

 

In case of DPS calculation, simply take maths formula. Its easy to create an exel-worksheet to work with that. I dont want to explain the simulation code, unless someone is interested in it. Probably its not the most elegant code, but it works fine. Simulations are based on random number generator (RNG). If you want to find out how good or under which circumstances a formula de facto works, simulation will show you the statistic using RNG. Statistical evaluation(like standard deviation) needs to be done in the end. After all, this is very powerful to explore some entirely ambiguous behaviors. In fact (almost) all theories in history were subsequently founded based on observations or simulations. In other words a theory always grows out of many observations.

 

 

The entire code/simulation was translated by Sine_Nomen into a very user-friendly web-version here where you can check DPS of each relic by input your individual stats! Notice this is only for DD without passive healing. Many thanks for the efforts!

 

Any further questions or suggestions? You are welcome!

Edited by X-Boson
corrected mistyped formula for relic DPS with sent/marau mid tree
Link to comment
Share on other sites

  • Replies 169
  • Created
  • Last Reply

Top Posters In This Topic

nice work.

 

the power to dps conversion thing can be tricky. i have estimated 0.35 for annhilation based on spreadsheets, but the bonus damage coefficents are the main contributor to this factor.

 

with regard to kinetic versus elemental... there is no tech interna;/elemental underworld relic right now, which means the crit rate will be much lower (not sure what the force crit chance is for a tech user... most likey derived from willpower and strngth or soemthing...).

 

so i have heard that bosses have 35% kinetic damage reduction, which equates to an amor of 7538. solving for the amount of armor reduction to make 352 kinetic damage equal 264 damage taken by the boss comes out to 38.09%

Link to comment
Share on other sites

nice work.

 

the power to dps conversion thing can be tricky. i have estimated 0.35 for annhilation based on spreadsheets, but the bonus damage coefficents are the main contributor to this factor.

 

with regard to kinetic versus elemental... there is no tech interna;/elemental underworld relic right now, which means the crit rate will be much lower (not sure what the force crit chance is for a tech user... most likey derived from willpower and strngth or soemthing...).

 

so i have heard that bosses have 35% kinetic damage reduction, which equates to an amor of 7538. solving for the amount of armor reduction to make 352 kinetic damage equal 264 damage taken by the boss comes out to 38.09%

 

I have 1power=0.35DPS as well for anni marau pre-2.0. I once made a calc tabular where you can simply input stats/weapon-hilt/buff/stim as parameter and have ability´s average dmg as output. I also made a typical mid-in-fight rotation where bersi was taken into account. Its alrdy out of date (because of skill tree change as well), but just for illustration and fun spreadsheet_anni_marau_pre2.0

 

You can check force-user´s force crit on askmrrobot, simply create a char and mouseover its stats. Force crit/bonus dmg will be slightly increase by willpower as sent/marau. Besides you can generally increase your force crit by 6% as sent/marau for example, using insight/malice on the right tree bottom. As cons/sorc maximal by 5% from heal tree (penerating light/seeping darkness+3% & serenity/life surge +2% as healer)

Edited by X-Boson
Link to comment
Share on other sites

This is all amazing and way beyond me. I have only one question.

 

For a class that has passive damage increase (up to 12% for Watchman Sent/Anni Mara) how would that affect the DPS gain of the Internal/Elemental Damage-proc relic?

Link to comment
Share on other sites

This is all amazing and way beyond me. I have only one question.

 

For a class that has passive damage increase (up to 12% for Watchman Sent/Anni Mara) how would that affect the DPS gain of the Internal/Elemental Damage-proc relic?

 

Thy for feedback. relic´s dmg-amount will be increased as well. Since this saber form increase all damge dealt (focus/rage saber form as well). Btw, tooltip wont display damage change in relic from passive saber form, unless you put that relic in bag. But its only a display issue, damage will be increased correctly.

Edited by X-Boson
Link to comment
Share on other sites

Thy for feedback. relic´s dmg-amount will be increased as well. Since this saber form increase all damge dealt (focus/rage saber form as well). Btw, tooltip wont display damage change in relic from passive saber form, unless you put that relic in bag. But its only a display issue, damage will be increased correctly.

 

From examination of my own logs before, the relics cared nothing for my stats except crit chance and crit multi.

 

Power, weapons, all ignored, it used its own damage numbers,

 

So have damage boost talents been seen to boost fixed damage relics in logs?

Edited by Gyronamics
Link to comment
Share on other sites

I know pre-2.0 that my internal Relics did more damage than listed due to Juyo form. I'm just wondering if the damage increase would put the damage proc relic ahead of the power proc one. My guess is if so, only slightly.

 

 

From examination of my own logs before, the relics cared nothing for my stats except crit chance and crit multi.

 

Power, weapons, all ignored, it used its own damage numbers,

 

So have damage boost talents been seen to boost fixed damage relics in logs?

Link to comment
Share on other sites

I know pre-2.0 that my internal Relics did more damage than listed due to Juyo form. I'm just wondering if the damage increase would put the damage proc relic ahead of the power proc one. My guess is if so, only slightly.

 

Yep, at this point its rather a question of power´s fine scaling in DPS. With +1.12% over all damage, 30%crit, 70%surge and 1power=0.39649DPS, internal proc and power boost will give you exact the same DPS. For any smaller scaling value than 0.39649, internal relic wins.

 

In case anyone wants to test with his individual stats as watchman/annihilation with +12% all dmg dealt, link to online calculator here . It is DPS difference internal minus power boost in the formula, whereby hit frequency was preset to 2.5hits/sec. Ive simplifed it, so all you need to do is input crit as "c" ( input 0.3 means 30%), crit-multi as "s"(input 0.7 means 70%) and x is power´s scaling in DPS (0.35, 0.38,0.4, what ever). Then you will immediately see the outcoming number at your input

 

Notice the calcution for relic´s DPS I did in mainpost was based on a purely assumed stats. If you want to compare power boost and dmg proc exactly, you must know the exact power to DPS exchange rate. But in any case power boost relic is better than power click. Power click is e.g. very nice for trash killing takes 30sec, whereby you can gain extra power during this fight duration.

 

Btw, actually we should write e.g. 1power=0.38124DPS, instead of 1power=0.38DPS. Because power value and DPS are in magnitude of thousand, therefore at least 5 decimal places should be given.

Edited by X-Boson
Link to comment
Share on other sites

Any further questions or suggestions? You are welcome!

 

First, thank you for your efforts! I suggest an easy to use web version; and because I had some free time, I ported your code to javascript and threw it in a bare bones html/css file. Variable input is on the left, the output is on the right. See this image as an example: imgur link (SFW, of course)

 

I don have any server space laying around (and didn't bother looking for any) edit: This should now be accessible on this Google Sites page, but interested users can copy the code below into a text file, save as .html, and open it in a modern browser. I only tested in Chrome, so it's entirely possible other browsers may gag and die. The results update when you change an input (and the input loses focus). In other words, change a number, then hit tab or click somewhere else on the page if the results aren't immediately altered.

 

The whole deal (javascript is minified, see below for the prettier version):

 

<!DOCTYPE html>
<html>
<head>
 <meta charset="ISO-8859-1">
 <title>DPS Proc Sim</title>

 <style type="text/css">
   div {position: relative; float: left; margin-right: 15px; }
   ul {list-style: none; position: relative;}
   ul input{position: absolute; right: 0; width: 100px;}
 </style>

 <!--[if lt IE 9]>
 <script>
   document.createElement("header" );
   document.createElement("footer" );
   document.createElement("section"); 
   document.createElement("aside"  );
   document.createElement("nav"    );
   document.createElement("article"); 
   document.createElement("hgroup" ); 
   document.createElement("time"   );
 </script>
 <![endif]-->
</head>
<body>

 <div style="width: 400px;">
     <ul>
     <li><label>non-crit procdmg on target</label><input id="procDmg" type="text" value="1" /></li>
     <li><label>your crit-chance in %</label><input id="yourCrit" type="text" value="23.45" /> </li>
     <li><LABEL>your surge rating in %</LABEL><input id="yourSurge" type="text" value="75.79" />   </li>    
     <li><label>number of on-hits on target</label><input id="nHits" type="text" value="800" /></li>
     <li><label>number of simulations</label><input id="ntests" type="text" value="500" /></li>
     <li><label>input percentage procchance</label><input id="procChance" type="text" value="30" /></li>
     <li><label>locktime in second after each proc</label><input id="lockTime" type="text" value="4.5" /></li>
     </ul>
 </div>

 <div id="output" style="white-space: pre-wrap;"></div>
</body>

<script>var procLock=function(){function h(){var a,b,g,c,j,h=document.getElementById("procDmg").value,s=document.getElementById("yourCrit").value,t=document.getElementById("yourSurge").value,d=document.getElementById("nHits").value,e=document.getElementById("ntests").value,r=document.getElementById("procChance").value,p=document.getElementById("lockTime").value,k=Array(e),l=b=0,m=0,n=0;q.innerHTML="";f("Simulation of DPS increase from relic\u00b4s autoproc in SWTOR 2.0\n\n");f(r+"% chance to have "+h+" procdmg each hit with a locktime of 4.5 second\n\n");
f("  simulate DPS dependent on hitfrequency: \n\n");f("   --\x3ehit "+d+" times in all and "+e+" times simulations for each hitfrequency \n\n\n");for(c=1;5>=c;c+=0.5){m=l=n=0;k[e]=0;for(a=1;a<=e;a++){j=0;for(g=1;g<=d;g++){count=0;for(b=1;b<d&&!(Math.random()<=r/100&&count++,1==count&&(count=b+c*p),1<count);b++);j++;g+=count-1;if(g>d-j*(c*p-(c*p).toFixed(0)))break}k[a-1]=j;n+=j}b=n/e;for(a=1;a<=e;a++)l+=(b-k[a-1])*(b-k[a-1]),m=Math.sqrt(l/(e-1));f(" Average number of procs with "+c+" hits/sec is "+
   b.toFixed(2)+" after "+d+" hits (fight duration "+(d/c/60).toFixed(2)+"min) \n");f("  (overall "+(100*(b/d)).toFixed(2)+"% procs with standard deviation "+(100*(m/b)).toFixed(2)+"%, 95.4% measured numbers within "+b.toFixed(2)+"\u00b1"+(2*m).toFixed(2)+") \n\n");f("     =>DPS increase with "+c+" hits/sec is "+((1+s/100*t/100)*b*c/d*h).toFixed(4)+"\n\n")}}function f(a){"\n"===a?q.appendChild(document.createElement("br")):q.appendChild(document.createTextNode(a))}window.onload=function(){var a,b=document.getElementsByTagName("input");
   for(a=0;a<b.length;a++)b[a].addEventListener("change",function(){h()});h()};var q=document.getElementById("output")}();</script>

</html>

 

 

Just the javascript (106 lines with whitespace)

 

var procLock = (function procLock_closure() {

 window.onload = function() {
   var i,
       inputs = document.getElementsByTagName('input');

   for(i = 0; i < inputs.length; i++) {
     inputs[i].addEventListener('change', function (e) {
       procLock();
     });
   }

   procLock();
 };

 var output = document.getElementById('output');


 function procLock() {
   var i, j, k, hitFreq, procNumber,
       procDmg = document.getElementById('procDmg').value,  //input non-crit procdmg on target (not exactly tooltip value because of armor & resist!)
       yourCrit = document.getElementById('yourCrit').value,   //input your crit-chance in %      
       yourSurge = document.getElementById('yourSurge').value,  //input your magnitude of crit-dmg (surge rating) in %
       nHits = document.getElementById('nHits').value,        //input number of on-hits on target
       ntests = document.getElementById('ntests').value,       //input number of simulations
       procChance = document.getElementById('procChance').value,    //input procentage procchance
       lockTime = document.getElementById('lockTime').value,     //input locktime in second after each proc
       numb = new Array(ntests),
       average = 0,
       sumdev = 0,
       stddev = 0,
       sum = 0;


   output.innerHTML = '';
   cout("Simulation of DPS increase from relic´s autoproc in SWTOR 2.0\n\n");  
   cout(procChance + "% chance to have " + procDmg
     + " procdmg each hit with a locktime of 4.5 second\n\n");
   cout("  simulate DPS dependent on hitfrequency: \n\n");
   cout("   -->hit " + nHits + " times in all and " + ntests + " times simulations for each hitfrequency \n\n\n");


   for(hitFreq = 1; hitFreq <= 5; hitFreq += 0.5) {
     sum = 0;
     average = 0;
     sumdev = 0;
     stddev = 0;
     numb[ntests] = 0;    


     for(i = 1; i <= ntests; i++) {
       procNumber = 0;

       for(k = 1; k <= nHits; k++) {
         count = 0;

         for(j = 1; j < nHits; j++) {
           if(Math.random() <= (procChance / 100)) {            
             count++;
           }

           if(count == 1) {
             count = j + hitFreq * lockTime;
           }

           if(count > 1) {
             break;
           }
         }

         procNumber++;
         k += count - 1;

         if(k > (nHits - procNumber * (hitFreq * lockTime - (hitFreq * lockTime).toFixed(0))) ) {
           break;
         }
       }    //nhits loop ends

       numb[i-1] = procNumber;
       sum += procNumber;
     }   //ntest loop ends

     average = sum / ntests;

     for(i = 1; i <= ntests; i++) {  
        sumdev += (average - numb[i-1]) * (average - numb[i-1]);
        stddev = Math.sqrt(sumdev / (ntests - 1));
     }


     cout(" Average number of procs with " + hitFreq + " hits/sec is " + average.toFixed(2) + " after " + nHits + " hits (fight duration " + (nHits / hitFreq / 60).toFixed(2) + "min) \n");
     cout("  (overall " + (average / nHits * 100).toFixed(2) + "% procs with standard deviation " +
          (stddev / average * 100).toFixed(2) + "%, 95.4% measured numbers within " + average.toFixed(2) + "±" + (2*stddev).toFixed(2) + ") \n\n");
     cout("     =>DPS increase with " + hitFreq +  " hits/sec is "
         + ((1 + yourCrit / 100 * yourSurge / 100) * average * hitFreq / nHits * procDmg).toFixed(4) + '\n\n');
   }    //hitfrequency loop ends
 }

 function cout(text) {
   (text === "\n") ?
     output.appendChild(document.createElement('br'))
   :    
     output.appendChild(document.createTextNode(text));

 }
})();   //bottom of procLock_closure()

 

 

Hopefully someone finds it useful.:mon_biggrin:

Edited by Sine_Nomen
Added spoiler tags
Link to comment
Share on other sites

 

Hopefully someone finds it useful.:mon_biggrin:

 

 

Thanks and much appreciated :)

 

I mainly use C++ based programming in my subject, not really familiar with Java yet. But I´ll definitely copy/paste and work on it! Since I always have the feeling that Java is handier than C++ stuff.

Edited by X-Boson
Link to comment
Share on other sites

Thanks and much appreciated :)

 

I mainly use C++ based programming in my subject, not really familiar with Java yet. But I´ll definitely copy/paste and work on it! Since I always have the feeling that Java is handier than C++ stuff.

 

Update: You did all the hard work! :D This should now be accessible on this Google Sites page. That should be even easier for those who don't want to copy and paste, though the performance has taken a noticeable and unpleasant hit. There's also a little tank stat tool based on KeyboardNinja's numbers in this thread.

Link to comment
Share on other sites

Nice work! This is exactly how it is meant to be! As mentioned im working on that programming in leisure. Thanks again for enhancement.

 

...smell of a convenient online calculator for gear optimization. :rak_03:

Link to comment
Share on other sites

Corrected the wrong values I calculated for sent/marau mid tree armor pen ability (sry, mistyped formula!). I also overlooked Hand of justice/slaughter in the skill-tree which has a chance of 45% to finish the cd on +100% armor pen (uptime 20sec, so 5sec longer than 15sec). This 15sec CD should now be reduced at:

 

0.5*15+0.5*(5+1/(HitFreq*0.45))

 

Say you do 2.5 hits every sec, thus the average cd would be at 10.44 sec instead of 15 sec. Its analogous to uptime of proc relic which is in average [Locktime + 1/(0.3*HitFreq)] (in both case exponential distribution between triggers). At the end you have to statistically weight both CDs fifty-fifty. Just for fun, plotted reduced CD as a function of hitfrequency http://imageshack.us/photo/my-images/841/c802.png/ which approaches asymptotically to 10 sec

 

By way of illustration, I further varied 1power from +0.33 to +0.42DPS and calc the outcoming DPS in mainpost.

Edited by X-Boson
Link to comment
Share on other sites

I uploaded a spreadsheet to calculate relic´s DPS, where you can input all kinds of individual stats there. Underworld relics were preset in there. Only fight duration is fixed at 4 or 4.5 minutes which will decide if you can use power click 2 or 3 times.

 

In case you want to have fight duration to any number (only useful for power click relic), copy/paste the following C++11 script on ideone.com. Hope Sine_Nomen has time for more converting :D This time I didnt do any dynamic simulation, but pure static calculation.

 

 

#include <iostream>
#include <random>
#include <iomanip>
#include <stdio.h>
#include <math.h>


   float boost(float b, float a, float t){ //a, b in minute, t in second
         float time;
         int c=int(b/a);
         float d=b-c*a;

           if (b>=a) {                           
               if (d==0 || d <=0.5 ) 
                   time=d*60+c*t; //in second

               else if (d >0.5) 
                   time=t+c*t; //in second

           }

            if (b<a){   
                if (b<=0.5 ) 
                   time=b*60; //in second
                else if (b >0.5) 
                   time=t; //in second

           }

           return time;} 

using namespace std;


int main(){

       const float power2dps = 0.4; //convert 1 power into DPS
       const float hitfreq = 2.5; //input overall hit number minus proc number, then divided by fight duration in second
       const float fightduration = 4.5; //input your fight duration in minutes
       const float yourcrit = 30.00; //input your crit-chance in %
       const float yoursurge = 70.00; //input your magnitude of crit-dmg (surge rating) in %   

       const int powerclick = 425; //input power of click relis value
       const float boosttime = 30; //input boost time of power click in second
       const float boostcd = 2; //input power click´s cooldown in minutes
       const int powerproc = 550;  //input power of powerproc relic
       const int internalproc = 264; //input tooltip dmg of internal/elemental
       const int kineticproc = 352; //input tooltip dmg of kinetic/force relic
       const int healproc = 634; //input tooltip dmg of healproc relic
       const int power_on_relic = 32;

   cout << fixed << setprecision(2);
   cout << " power-proc DPS is " << 6*0.3*hitfreq/(1+0.3*20*hitfreq)*powerproc*power2dps+power_on_relic*power2dps << " \n\n\n" ;
   cout << " power-click DPS is "<<  boost(fightduration, boostcd, boosttime)/fightduration/60*powerclick*power2dps+power_on_relic*power2dps <<  " \n\n\n" ;
   cout << " internal/elemental autoproc DPS is " << 0.3*hitfreq/(1+0.3*4.5*hitfreq)*(1+yourcrit/100*yoursurge/100)*internalproc+power_on_relic*power2dps << " \n" ;
   cout << " =>  as watchman(+12%dmg): " << 0.3*hitfreq/(1+0.3*4.5*hitfreq)*(1+yourcrit/100*yoursurge/100)*internalproc*1.12+power_on_relic*power2dps << " \n\n\n" ;
   cout << " kinetic/force autoproc DPS on boss is " << 0.3*hitfreq/(1+0.3*4.5*hitfreq)*(1+yourcrit/100*yoursurge/100)*kineticproc*(1- 7538.46/( 7538.46+240*55+800))+power_on_relic*power2dps << " \n" ;
   cout << " =>  with 20% armor reduction: " << 0.3*hitfreq/(1+0.3*4.5*hitfreq)*(1+yourcrit/100*yoursurge/100)*kineticproc*(1- 7538.46*0.8/(7538.46*0.8+240*55+800))+power_on_relic*power2dps  << " \n" ;
   cout << " =>  with 20% armor reduction and sent/marau mid tree: " 
   << (0.3*hitfreq/(1+0.3*4.5*hitfreq)*(1+yourcrit/100*yoursurge/100)*kineticproc*(1- 7538.46*0.8/(7538.46*0.8+240*55+800))+power_on_relic*power2dps)*(1-4.5/(0.5*15+0.5*(5+1/(hitfreq*0.45))))+4.5/(0.5*15+0.5*(5+1/(hitfreq*0.45)))*(0.3*hitfreq/(1+0.3*4.5*hitfreq)*(1+yourcrit/100*yoursurge/100)*kineticproc+power_on_relic*power2dps)
   <<" \n\n\n" ;
   cout << " heal-proc HPS is " << 0.5*hitfreq/(1+0.5*20*hitfreq)*(1+yourcrit/100*yoursurge/100)*healproc+power_on_relic*power2dps << " \n" ;

}

 

 

Input stats starting from line "const float power2dps=blahblah" mid in script.

 

Great work!

 

Would you by any chance be able to do a comparison between the relics for a burst scenario? For example, the final phase of Writhing Horror HM, and the final phase of Titan 6.

 

Thy for feedback. Well, in that case we want to burst down boss as fast as possible, so consider power click as a very important dmg buff like stim. I think dmg buff stack multiplicatively(correct me if Im wrong), so use power click together with stim & sent/maura dmg buff and maybe additional dmg taken by boss is very effective! I dont think its very useful to do specific calcs in this regard. Because in real boss fight **** happens. Like you gain 6sec power proc, but cannot do any dmg on boss during this short time. In that case you have to wait over 20sec for next proc. But if you self-activate power click, then you probably know something like that will NOT happen, so that you can fully use power boost. Dmg proc relic is the safest choice for a very dynamic fight. So this is rather a question of movement during the fight.

Edited by X-Boson
Link to comment
Share on other sites

Hope Sine_Nomen has time for more converting :D This time I didnt do any dynamic simulation, but pure static calculation.

 

You can find it here. Your boost function seemed verbose and complex to me, so I rewrote it. In C++, my version would look like this:

float boost(float b, float a, float t) {   //a, b in minutes, t in seconds
         float time,
                 d = fmod(b, a);
         int c = int(b / a);

         time = (d > 0) ? c * t + min(t, d * 60) : c * t;

         return time;          
   } 

 

javascript for the link above:

var boson = (function boson_closure(){
 window.onload = function() {
   var i,
       inputs = document.getElementsByTagName('input');

   for(i = 0; i < inputs.length; i++) {
     inputs[i].addEventListener('change', function (e) {
       main();
     });
   }

   main();
 };

 var output = document.getElementById('output');


 /**
  * Returns total uptime of click relic over the entire fight duration. 
  * @param duration in minutes. Fight duration.
  * @param cooldown in minutes. Relic cooldown.
  * @param uptime in seconds. Uptime per relic click.
  * @returns time in seconds
  */
 function boost(duration, cooldown, uptime) {
   var time, 
       fullClicks = Math.floor(duration / cooldown),
       partTime = duration % cooldown;

   time = (partTime > 0) ?
       uptime * fullClicks + Math.min(uptime, partTime * 60)
     : uptime * fullClicks;    

   return time;
 }


 function main() {
   var power2dps = document.getElementById('power2dps').value,       //convert 1 power into DPS        
       hitFreq = 2.5,    //input overall hit number minus proc number, then divided by fight duration in second
       fightDuration = document.getElementById('fightDuration').value, //input your fight duration in minutes
       yourCrit = document.getElementById('yourCrit').value,         //input your crit-chance in %
       yourSurge = document.getElementById('yourSurge').value,       //input your magnitude of crit-dmg (surge rating) in %   
       powerClick = document.getElementById('powerClick').value,     //input power of click relics value
       boostTime = document.getElementById('boostTime').value,       //input boost time of power click in second
       boostCD = document.getElementById('boostCD').value,           //input power click´s cooldown in minutes
       powerProc = document.getElementById('powerProc').value,       //input power of powerProc relic
       internalProc = document.getElementById('internalProc').value, //input tooltip dmg of internal/elemental
       kineticProc = document.getElementById('kineticProc').value,   //input tooltip dmg of kinetic/force relic
       healproc = document.getElementById('healProc').value,         //input tooltip dmg of healproc relic
       power_on_relic = document.getElementById('staticPower').value,

       factor = 0.3 * hitFreq / (1 + 0.3 * 4.5 * hitFreq),   //needs a descriptive variable name
       critMult = (1 + yourCrit / 100 * yourSurge / 100),    //needs a descriptive variable name
       staticDps = power_on_relic * power2dps;               //dps added by relic's static power


     output.innerHTML = '';

     cout(" power-proc DPS is " + ( 6 * 0.3 * hitFreq / (1 + 0.3 * 20 * hitFreq) * powerProc * power2dps + staticDps ).toFixed(2) + "\n\n" 
         + " power-click DPS is " + (boost(fightDuration, boostCD, boostTime) / fightDuration / 60 * powerClick * power2dps + staticDps).toFixed(2) + "\n\n"
         + " internal/elemental autoproc DPS is " + (factor * critMult * internalProc + staticDps).toFixed(2) + "\n"
         + "  =>  as watchman(+12%dmg): " + (factor * critMult * internalProc * 1.12 + staticDps).toFixed(2) + "\n\n"
         + " kinetic/force autoproc DPS on boss is " + (factor * critMult * kineticProc * (1 - 7538.46 / (7538.46 + 240 * 55 + 800)) + staticDps).toFixed(2) + "\n"
         + "  =>  with 20% armor reduction: " + (factor * critMult * kineticProc*(1- 7538.46 * 0.8 / (7538.46 * 0.8 + 240 * 55 + 800)) + staticDps).toFixed(2) + "\n"
         + "  =>  with 20% armor reduction and Combat/Carnage tree: " 
         + ((factor * critMult * kineticProc * (1 - 7538.46 * 0.8 / (7538.46 * 0.8 + 240 * 55 + 800)) + staticDps)*(1 - 4.5 / (0.5 * 15 + 0.5 * (5 + 1 / (hitFreq * 0.45)))) + 4.5 / (0.5 * 15 + 0.5 * (5 + 1 / (hitFreq * 0.45))) * (factor * critMult * kineticProc + staticDps)).toFixed(2)
         + "\n\n"
         + " heal-proc HPS is " + (0.5 * hitFreq / (1 + 0.5 * 20 * hitFreq) * critMult * healproc + staticDps).toFixed(2) + " \n");
 }

 /**
  * Approximates the function of c++'s cout, writing console style output to a DOM element "output". 
  * @param text  The text to be displayed.
  */
 function cout(text) {
   (text === "\n") ?
     output.appendChild(document.createElement('br'))
   :    
     output.appendChild(document.createTextNode(text));    
 }
})();  //bottom of boson_closure()

 

Link to comment
Share on other sites

You can find it here. Your boost function seemed verbose and complex to me, so I rewrote it.

 

Great job, thanks again for taking the time! Now I´ve learned lots about java from you.:tran_evil::tran_evil: You right about the code for power click relic. It was not smart at all, rather very literal and straightforward translation.

 

 

In respect of power scaling factor, I suggest a very easy way using dmg-log:

 

 

  1. leave your both relic slots free and do a 4-6 minutes log
  2. equip 2x Relic of Boundless Ages which gives you 226 or 240 pure power and do a 4-6 minutes log again
  3. repeat this at least three times, then upload your logs and check your average DPS change on TORParse, make sure you´ve seen a significant increase in DPS (say +70) before continue!

 

 

Ofc I´m interested in doing statistic analyse if you link your parse here. This test can be done with augments as well. The larger the change in gear the more stable the result (say 10 augs, ....but money).

 

In any case the higher your average DPS during a combat, the better the power scales in DPS and the better the power proc relic.

Edited by X-Boson
Link to comment
Share on other sites

  • 2 weeks later...

javascript for the link above:

var boson = (function boson_closure(){
 window.onload = function() {
   var i,
       inputs = document.getElementsByTagName('input');

   for(i = 0; i < inputs.length; i++) {
     inputs[i].addEventListener('change', function (e) {
       main();
     });
   }

   main();
 };

 var output = document.getElementById('output');


 /**
  * Returns total uptime of click relic over the entire fight duration. 
  * @param duration in minutes. Fight duration.
  * @param cooldown in minutes. Relic cooldown.
  * @param uptime in seconds. Uptime per relic click.
  * @returns time in seconds
  */
 function boost(duration, cooldown, uptime) {
   var time, 
       fullClicks = Math.floor(duration / cooldown),
       partTime = duration % cooldown;

   time = (partTime > 0) ?
       uptime * fullClicks + Math.min(uptime, partTime * 60)
     : uptime * fullClicks;    

   return time;
 }


 function main() {
   var power2dps = document.getElementById('power2dps').value,       //convert 1 power into DPS        
       hitFreq = 2.5,    //input overall hit number minus proc number, then divided by fight duration in second
       fightDuration = document.getElementById('fightDuration').value, //input your fight duration in minutes
       yourCrit = document.getElementById('yourCrit').value,         //input your crit-chance in %
       yourSurge = document.getElementById('yourSurge').value,       //input your magnitude of crit-dmg (surge rating) in %   
       powerClick = document.getElementById('powerClick').value,     //input power of click relics value
       boostTime = document.getElementById('boostTime').value,       //input boost time of power click in second
       boostCD = document.getElementById('boostCD').value,           //input power click´s cooldown in minutes
       powerProc = document.getElementById('powerProc').value,       //input power of powerProc relic
       internalProc = document.getElementById('internalProc').value, //input tooltip dmg of internal/elemental
       kineticProc = document.getElementById('kineticProc').value,   //input tooltip dmg of kinetic/force relic
       healproc = document.getElementById('healProc').value,         //input tooltip dmg of healproc relic
       power_on_relic = document.getElementById('staticPower').value,

       factor = 0.3 * hitFreq / (1 + 0.3 * 4.5 * hitFreq),   //needs a descriptive variable name
       critMult = (1 + yourCrit / 100 * yourSurge / 100),    //needs a descriptive variable name
       staticDps = power_on_relic * power2dps;               //dps added by relic's static power


     output.innerHTML = '';

     cout(" power-proc DPS is " + ( 6 * 0.3 * hitFreq / (1 + 0.3 * 20 * hitFreq) * powerProc * power2dps + staticDps ).toFixed(2) + "\n\n" 
         + " power-click DPS is " + (boost(fightDuration, boostCD, boostTime) / fightDuration / 60 * powerClick * power2dps + staticDps).toFixed(2) + "\n\n"
         + " internal/elemental autoproc DPS is " + (factor * critMult * internalProc + staticDps).toFixed(2) + "\n"
         + "  =>  as watchman(+12%dmg): " + (factor * critMult * internalProc * 1.12 + staticDps).toFixed(2) + "\n\n"
         + " kinetic/force autoproc DPS on boss is " + (factor * critMult * kineticProc * (1 - 7538.46 / (7538.46 + 240 * 55 + 800)) + staticDps).toFixed(2) + "\n"
         + "  =>  with 20% armor reduction: " + (factor * critMult * kineticProc*(1- 7538.46 * 0.8 / (7538.46 * 0.8 + 240 * 55 + 800)) + staticDps).toFixed(2) + "\n"
         + "  =>  with 20% armor reduction and Combat/Carnage tree: " 
         + ((factor * critMult * kineticProc * (1 - 7538.46 * 0.8 / (7538.46 * 0.8 + 240 * 55 + 800)) + staticDps)*(1 - 4.5 / (0.5 * 15 + 0.5 * (5 + 1 / (hitFreq * 0.45)))) + 4.5 / (0.5 * 15 + 0.5 * (5 + 1 / (hitFreq * 0.45))) * (factor * critMult * kineticProc + staticDps)).toFixed(2)
         + "\n\n"
         + " heal-proc HPS is " + (0.5 * hitFreq / (1 + 0.5 * 20 * hitFreq) * critMult * healproc + staticDps).toFixed(2) + " \n");
 }

 /**
  * Approximates the function of c++'s cout, writing console style output to a DOM element "output". 
  * @param text  The text to be displayed.
  */
 function cout(text) {
   (text === "\n") ?
     output.appendChild(document.createElement('br'))
   :    
     output.appendChild(document.createTextNode(text));    
 }
})();  //bottom of boson_closure()

 

...oh at parameter input it should be

 

hitFreq= document.getElementById('hitFreq').value,

 

Otherwise hit frequency is fixed at 2.5hits/sec. Hope you are still reachable here :D

Edited by X-Boson
Link to comment
Share on other sites

I suppose it was kind of an odd decision on my part to leave just one variable fixed :o. The update has been made. It's probably clear implicitly, but (for anyone learning from this) note that the corresponding HTML must be updated along with the javascript. Failing to do so would leave your code looking for a DOM element that doesnt exist.
Link to comment
Share on other sites

Thanks very much for making this! I have a question though.

 

I have an EWH relic which someone recently told me is BiS still. Can you confirm this? EWH Relic is +120 Power at all times.

 

Thanks in advance.

 

hi there,

 

Elite Warhero is even worse than any of the dread guard relics. Its DPS is in average 10 lower than dread guard power click. People should have thrown it away before 2.0.

 

...so someone is trolling u :tran_eek:

Edited by X-Boson
Link to comment
Share on other sites

So I just got back to the game and haven't been able to test this, but have heard that the proc damage and proc power relics will not stack.

 

Can you confirm whether or not this is the case?

 

Yeah, its a bug which should be fixed in patch2.3. Check this thread here.

 

Anyway It seems only underworld relics are bugged.

Link to comment
Share on other sites

  • 1 month later...

Hi,

 

I managed to DPS quite a fair bit on my Balance Shadow over the weekend and thought of just cross checking the actual DPS I was getting from my Arkanian Relic of Dark Radiance with the calculated values. Are the much lower numbers (compared to the calculator) that I am getting in Golden Fury, Dash'Roode, Titan 6, Olok just due to the mechanics of the fight having a lull in the DPS? Or am I missing something?

 

Advanced Class & Skill Tree

Balance Shadow

 

Critical Chance / Critical Multiplier

24.27% (with prototype nano-infused stim) / 71.16%

 

Relics

Arkanian Internal Dmg auto proc (241) + Arkanian auto power proc

 

Power > DPS used in web calculator

0 (only checking for auto proc dmg contribution to DPS)

 

Live Parses

 

SM 16 Golden Fury

http://www.torparse.com/a/387822/time/1376709632/1376709934/0/Overview

301s fight length, 705 hits, 2.34 hit frequency, 32.06% crit hits

 

38.45 Dark Spike DPS, 49 hits, 20.41 % Dark Spike crit hits

*Web calculator Dark Spike DPS: 47.70 (-9.25)

 

HM 16 Golden Fury

http://www.torparse.com/a/387822/time/1376710624/1376711146/0/Damage+Dealt

522s fight length, 1289 hits, 2.47 hit frequency, 30.95% crit hits

 

38.7 Dark Spike DPS, 79 hits, 30.43 % Dark Spike crit hits

*Web calculator Dark Spike DPS: 48.32 (-9.62)

 

 

SM 16 S&V Dash'Roode

http://www.torparse.com/a/387822/4/0/Damage+Dealt

298s fight length, 592 hits, 1.99 hit frequency, 36.82% crit hits

 

38.06 Dark Spike DPS, 38 hits, 34.21% crit hits

*Web calculator Dark Spike DPS: 45.77 (-7.71)

 

SM 16 S&V Titan 6

http://www.torparse.com/a/387822/8/0/Damage+Dealt

272s fight length, 655 hits, 2.41 hit frequency, 33,74% crit hits

 

38.92 Dark Spike DPS, 39 hits, 17.95% crit hits

*Web calculator Dark Spike DPS: 48.04 (-9.12)

 

SM 16 S&V Thrasher

http://www.torparse.com/a/387822/15/0/Damage+Dealt

185s fight length, 529 hits, 2.86 hit frequency, 30.43% crit hits

 

45.89 Dark Spike DPS, 31 hits, 19.35% crit hits

*Web calculator Dark Spike DPS: 49.88 (-3.99)

 

SM 16 S&V Operations Chief (trimmed to only final part)

http://www.torparse.com/a/387822/time/1376716009/1376716146/0/Overview

136s fight length, 213 hits, 1.57 hit frequency, 33.33% crit hits

 

39.3 Dark Spike DPS, 18 hits, 33.33% crit hits

*Web calculator Dark Spike DPS: 42.67 (-3.37)

 

SM 16 S&V Olok (trimmed only to final part)

http://www.torparse.com/a/387822/time/1376716923/1376717222/0/Overview

299s fight length, 499 hits, 1.67 hit frequency, 34.87% crit hits

 

36.85 Dark Spike DPS, 40 hits, 20% crit hits

*Web calculator Dark Spike DPS: 43.51 (-6.66)

 

SM 16 S&V Cartel Warlords

http://www.torparse.com/a/387822/30/0/Damage+Dealt

346s fight length, 928 hits, 2.68 hit frequency, 33.19% crit hits

 

45.34 Dark Spike DPS, 58 hits, 17.24% crit hits

*Web calculator Dark Spike DPS: 49.20 (-3.86)

 

SM 16 S&V Styrak

http://www.torparse.com/a/387822/34/0/Damage+Dealt

609s fight length, 1163 hits, 1.91 hit frequency, 34.65% crit hits

 

40.39 Dark Spike DPS, 82 hits, 24.39% crit hits

*Web calculator Dark Spike DPS: 45.25 (-4.86)

 

Operations Dummy Parse 1

http://www.torparse.com/a/388764/1/0/Damage+Dealt

320s fight length, 958 hits, 2.99 hit frequency, 30.06% crit hits

 

47.9 Dark Spike DPS, 54 hits, 27.78% crit hits

*Web calculator Dark Spike DPS: 50.33

 

Operations Dummy Parse 2

http://www.torparse.com/a/388764/2/0/Damage+Dealt

309s fight length, 997 hits, 3.23 hit frequency, 32.7% crit hits

 

50.52 Dark Spike DPS, 56 hits, 25% crit hits

*Web calculator Dark Spike DPS: 51.09 (-0.57, whoa!!! :jawa_cool:)

 

Operations Dummy Parse 3

http://www.torparse.com/a/388764/3/0/Damage+Dealt

382s fight length, 1184 hits, 3.1 hit frequency, 33.02% crit hits

 

47.56 Dark Spike DPS, 66 hits, 22.73% crit hits

*Web calculator Dark Spike DPS: 50.69 (-3.13)

Link to comment
Share on other sites

×
×
  • Create New...