Last active
April 1, 2020 04:25
-
-
Save ygshi/285549fcff2f8905187c2dfa17ab6de0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
#settings----------- | |
#damage settings, read from PoB--------------- | |
base_atk_intv=0.21 # your attack interval w/ 0 rage; in seconds. | |
rage_50_atk_intv=0.17 # your attack interval w/ 50 rage; in seconds. | |
base_atk_dmg=1641136.7 # your damage per hit w/ 0 rage; any unit is fine. | |
rage_50_atk_dmg=1836758.7 # your damage per hit w/ 50 rage; any unit is fine. | |
#Rage generation settings--------------- | |
Mob_rage=10 # how many rage stacks you gain from Mob Mentality; set to 0 to disable. | |
if_Crave=1. # enable Crave the Slaughter; set to 0 to disable. | |
if_RageSpt=0 # enable Rage Supoprt; set to 0 to disable. | |
#cooldown recovery settings--------------- | |
warcry_recovery=200 # your total increase to warcry cooldown recovery speed; Warbringer gives 100%; Battlecry gives 10%; Mob Mentatlity and other cluster jewel mods likely give 20%. | |
Berserk_recovery=30 # cooldown recovery specific to Berserk; mostly 30 from Second Wind. | |
cd_recovery=0 # your total increase to all cooldown recovery speed. | |
#Berserk enchant settings--------------- | |
Berserk_effect=0 # increased Berserk buff effect from enchant; set to 0 or 20 or 30. | |
Berserk_loss=0 # reduced Berserk rage loss from enchant; set to 0 or 25 or 40. | |
#other settings--------------- | |
startRage=50 # starting rage stacks. | |
time_intv=0.01 # time interval of this simulation. | |
time_tot=2000 # total time simulated. | |
#end of settings------------- | |
def Attack(): | |
Attack_intv=1./(1.+Berserk_buff*ifBerserk)/(rage/max_Rage*(1./rage_50_atk_intv-1./base_atk_intv)+1./base_atk_intv) | |
Attack_dmg=1.*(1.+Berserk_buff*ifBerserk)*(rage/max_Rage*(rage_50_atk_dmg-base_atk_dmg)+base_atk_dmg) | |
if time-lastAttack >= Attack_intv: | |
return Attack_dmg,time | |
else: | |
return 0.,lastAttack | |
def Crave(): | |
if if_Crave == 0.: | |
return 0.,0. | |
if Attack_dmg == 0.: | |
return 0.,lastCrave | |
elif time-lastCrave >= Crave_intv: | |
return 1.,time | |
else: | |
return 0.,lastCrave | |
def RageSpt(): | |
if if_Crave == 0.: | |
return 0.,0. | |
if Attack_dmg == 0.: | |
return 0.,lastRageSpt | |
elif time-lastRageSpt >= RageSpt_intv: | |
return 1.,time | |
else: | |
return 0.,lastRageSpt | |
def Mob(): | |
if time-lastMob >= Mob_intv: | |
return Mob_rage,time | |
else: | |
return 0.,lastMob | |
def Berserk(Berserk_trigger): | |
if ifBerserk == 1.: | |
if time-lastBerserk >= Berserk_intv: | |
gain=-1.*Berserk_rage*(1.+Berserk_multi*(time-startBerserk)) | |
if np.abs(gain) > rage: | |
return -1.*rage,0.,0.,0.,Berserk_cd | |
else: | |
return gain,1,time,startBerserk,0. | |
else: | |
return 0.,1.,lastBerserk,startBerserk,0. | |
elif cdBerserk == 0.: | |
if rage >= Berserk_trigger: | |
return 0.,1.,time,time,0. | |
else: | |
return 0.,0.,0.,0.,0. | |
else: | |
newcd=cdBerserk-time_intv | |
if newcd > 0.: | |
return 0.,0.,0.,0.,newcd | |
else: | |
return 0.,0.,0.,0.,0. | |
def Calc(Berserk_trigger): | |
global time,lastAttack,Crave_gain,lastCrave,RageSpt_gain,startBerserk,lastRageSpt,lastMob,lastBerserk,ifBerserk,cdBerserk,rage,Mob_gain,Berserk_gain,Attack_dmg | |
time_arr=np.linspace(0.,time_tot-time_intv,time_tot/time_intv) | |
lastAttack=0. | |
lastCrave=0. | |
lastRageSpt=0. | |
lastMob=0. | |
lastBerserk=0. | |
ifBerserk=0. | |
startBerserk=0. | |
cdBerserk=0. | |
rage=startRage | |
ifBerserk_arr=[] | |
rage_arr=[] | |
dmg_arr=[] | |
for time in time_arr: | |
Attack_dmg,lastAttack=Attack() | |
Crave_gain,lastCrave=Crave() | |
RageSpt_gain,lastRageSpt=RageSpt() | |
Mob_gain,lastMob=Mob() | |
rage += Crave_gain + RageSpt_gain + Mob_gain | |
if rage > max_Rage: | |
rage = max_Rage | |
Berserk_gain,ifBerserk,lastBerserk,startBerserk,cdBerserk=Berserk(Berserk_trigger) | |
rage += Berserk_gain | |
ifBerserk_arr.append(ifBerserk) | |
rage_arr.append(rage) | |
dmg_arr.append(Attack_dmg) | |
print 'Berserk uptime',round(sum(ifBerserk_arr)/np.float(len(ifBerserk_arr))*100.,2),'%' | |
print 'Average Rage stacks',round(sum(rage_arr)/np.float(len(rage_arr)),2) | |
print 'Average DPS',round(sum(dmg_arr)/time_tot,0) | |
return sum(dmg_arr)/time_tot | |
Mob_intv=4.0 | |
Crave_intv=0.3 | |
RageSpt_intv=0.4 | |
Berserk_cd=5.0 | |
max_Rage=50. | |
Mob_intv=Mob_intv/(1.+warcry_recovery/100.+cd_recovery/100.) | |
Crave_intv=Crave_intv/(1.+cd_recovery/100.) | |
RageSpt_intv=RageSpt_intv/(1.+cd_recovery/100.) | |
Berserk_cd=Berserk_cd/(1.+Berserk_recovery/100.+cd_recovery/100.) | |
Berserk_intv=0.1 | |
Berserk_rage=0.5*(100.-Berserk_loss)/100. | |
Berserk_multi=0.2 | |
Berserk_buff=0.2*(100.+Berserk_effect)/100. | |
print('starting simulation with on cooldown usage of Berserk...') | |
dps1=Calc(5.) | |
print('') | |
print('starting simulation with using Berserk on full rage...') | |
dps2=Calc(50.) | |
print('') | |
print('starting simulation without using Berserk...') | |
dps3=Calc(51.) | |
print('') | |
print('DPS gain from on cooldown usage of Berserk:') | |
print round((dps1/dps3-1.)*100.,2),'%' | |
print('DPS gain from on cooldown usage of Berserk:') | |
print round((dps2/dps3-1.)*100.,2),'%' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment