Skip to content

Instantly share code, notes, and snippets.

@ygshi
Last active April 1, 2020 04:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ygshi/285549fcff2f8905187c2dfa17ab6de0 to your computer and use it in GitHub Desktop.
Save ygshi/285549fcff2f8905187c2dfa17ab6de0 to your computer and use it in GitHub Desktop.
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