*Incoming Wall-o-Text*
For those of you who have access to MATLAB, or probably any decent code compiler, here is the code I have been using to estimate rotation potency.
Keep in mind this is not dps, this is simply the overall potency output over a period of time, going off the assumption that all spells have "roughly" the same % scaling from stats (ie. Fire 1 goes up by 2%, Blizz 3 goes up by 2%), and that all spells have the same crit rate.
*MATLAB code* - Note: The Firestarter proc use logic is still a bit rough. Feel free to improve upon it.
clc;
F1 = 270;
F3 = 396;
F3UI = 154;
B3AF = 154;
T2 = 14; %Estimating at 14 pps
SMana = 5; %Starting Mana: 4 for under 251 pie, 5 for over
rng('shuffle');
Time = 0; %Total Time Elapsed
TPot = 0; %Total Potency
Loops = 1000000; %Number of iterations <- Important!!!
STPot = 0; %Short Potency for this loop
STime = 0; %Short Time spend in this loop
Z = zeros(1, Loops); %Array to hold resulting PPS values for each loop
Next = 0; %Are we casting the next Fire 1?
Firestarter = 0; %Do we have a Firestarter proc up?
for s = 0: 1: Loops
STPot = 0; %Reset short potency
STime = 0; % Reset short time
TPot = TPot + 308; %Regen Phase (Thunder counted later)
STPot = STPot + 308; %Regen Phase
Time = Time + 8; %Time for Regen Phase
STime = STime + 8; %Time for Regen Phase
Mana = SMana; %Reset Mana to full
Next = 0;
while Mana > 0
TPot = TPot + F1; %Cast Fire 1
STPot = STPot + F1; %Cast Fire 1
Time = Time + 2.5; %1 GCD for Fire 1
STime = STime + 2.5; %1 GCD for Fire 1
Mana = Mana - 1; %Cast 1 spell
if rand(1) <= 0.6
Firestarter = 1;
end
if (Firestarter == 1 && Next == 1) %Have proc AND casted next Fire1
TPot = TPot + F3; %Cast Fire 3
STPot = STPot + F3; %Cast Fire 3
Time = Time + 2.5; %1 GCD for Instant Fire 3
STime = STime + 2.5; %1 GCD for Instant Fire 3
Next = 0;
Firestarter = 0;
else
Next = 1;
end
end
%Now we calculate the effect of Thunder 2
if STime >= 21
TPot = TPot + 295; %Full Thunder 2 Duration
STPot = STPot + 295; %Full Thunder 2 Duration
else
TPot = TPot + 14*STime; %Partial Thunder 2 Duration
STPot = STPot + 14*STime; %Partial Thunder 2 Duration
end
Z(s+1)=STPot/STime; %Update array with PPS for this loop
end
disp('5 Fire 1 Method')
fprintf('PPS = %f , STD = %f, Min = %f, Max = %f\n',TPot/Time,std(Z),min(Z),max(Z))
Time = 0;
TPot = 0;
for s = 0: 1: Loops
STPot = 0; %Reset short potency
STime = 0; % Reset short time
TPot = TPot + 308; %Regen Phase
STPot = STPot + 308; %Regen Phase
Time = Time + 8; %Time for Regen Phase
STime = STime + 8; %Time for Regen Phase
Mana = SMana; %Reset Mana to full
TPot = TPot + F3; %Quick-Cast Fire 3
STPot = STPot + F3; %Quick-Cast Fire 3
Time = Time + 2.5; %1 GCD for Quick-Cast Fire 3
STime = STime + 2.5; %1 GCD for Quick-Cast Fire 3
Mana = Mana - 2; %Cast equivalent of 2 spells
while Mana > 0
TPot = TPot + F1; %Cast Fire 1
STPot = STPot + F1; %Cast Fire 1
Time = Time + 2.5; %1 GCD for Fire 1
STime = STime + 2.5; %1 GCD for Fire 1
Mana = Mana - 1; %Cast 1 spell
if rand(1) <= 0.6
Firestarter = 1;
end
if (Firestarter == 1 && Next == 1) %Have proc AND casted next Fire1
TPot = TPot + F3; %Cast Fire 3
STPot = STPot + F3; %Cast Fire 3
Time = Time + 2.5; %1 GCD for Instant Fire 3
STime = STime + 2.5; %1 GCD for Instant Fire 3
Next = 0;
Firestarter = 0;
else
Next = 1;
end
end
%Now we calculate the effect of Thunder 2
if STime >= 21
TPot = TPot + 295; %Full Thunder 2 Duration
STPot = STPot + 295; %Full Thunder 2 Duration
else
TPot = TPot + 14*STime; %Partial Thunder 2 Duration
STPot = STPot + 14*STime; %Partial Thunder 2 Duration
end
Z(s+1)=STPot/STime; %Update array with PPS for this loop
end
format COMPACT
disp('F3 + 3 Fire 1 Method')
fprintf('PPS = %f , STD = %f, Min = %f, Max = %f\n\n',TPot/Time,std(Z),min(Z),max(Z))
*end code*
So we set the potency of our abilities as a reference. Start with a regen phase of Blizz 3, Thunder 2, and Fire 3, taking 8 seconds, and outputting 308 potency while setting up Thunder 2.
Then we start spamcasting Fire1.
After every Fire1, we try to get a Firestarter proc. If we did get a proc, we note that we have one. Regardless of whether we got a proc, we cast the next Fire1, and note that we are casting the next one.
Then we return to the actual casting sequence of Fire1, retry for Firestarter, but now since we cast a 2nd Fire 1, and have a Firestarter proc banked, we can cast Fire 3.
Once we're out of mana for Fire 1's, we look at hold long it's been since we cast Thunder 2, averaging it to 14 PPS, and factoring in the 8 second regen period beforehand... Then back to the top.
This sequence is run 1 million times to have reliable averaging.