之前看到那个计算各属性收益情况的帖子时就有过这个念头,后来嫌技能部分的计算太麻烦就没继续下去,今天趁着活动就把前面未完成的部分补补完。
这个帖子的核心思想是:根据自身的属性,来尽量准确的推算出战斗中我们能够制造的伤害,并转化成DPS。通过这个DPS的高低,我们可以简单明了的看出哪一套装备能够制造更高的伤害,从而达到最优化属性配置。
下面以战斗贼为例,来计算战斗中我们能够制造的各种伤害。
一:白字的伤害
设 MH=主手DPS MS=主手速度 OH=副手DPS OS=副手速度
AP=攻强 CRI=爆击 SCR=法术爆击 HIT=命中(这个命中不是角色攻击的命中率,而是装备、天赋等在你的基础命中率上提高的命中比率。比如一个MISS为10%的贼,其HIT是17%,而不是90%这个值) HAS=急速 ARP=破甲 DPS1=白字DPS
则白字DPS=[(主手DPS+AP/14)+0.75*(副手DPS+AP/14)]*急速系数1*急速系数2*爆击偏斜命中系数*破甲系数*天赋加成系数1(野蛮战斗,剑刃乱舞)
设 PHAS1=急速系数1(装备急速) PHAS2=急速系数2(团队急速)
设 x=CRI y=MIS=0.27-HIT z=GLA=0.24 则 PCRGLHT=爆击偏斜命中系数=[x*2.472+z*0.65+(1-x-y-z)]=1-0.27+HIT-0.35z+1.472x=0.646+HIT+1.472CRI PARP=破甲系数=1-(BOSS护甲*0.76*(1-破甲*破甲衰减系数))/(护甲常数+(BOSS护甲*0.76*(1-破甲*破甲衰减系数))) 其中 BOSS护甲=10643 护甲常数=15232.5 破甲衰减系数=1/{[8088.68/(8088.68+15232.5)]*3}=0.9611 则 PARP=1-(8088.68*(1-0.9611*ARP))/[(8088.68*(1-0.9611*ARP))+15232.5]
PTAL=天赋加成系数1 天赋加成包括野蛮战斗和剑刃乱舞 剑刃乱舞的作用是每120秒中作用15秒,其效果是使白字和致伤毒药的伤害提高20%。 设PFLU为剑刃乱舞系数 PFLU=(15*1.2+105)/120=1.025 则 PTAL=1.04*1.025=1.066
所以 DPS1=[(MH+AP/14)+0.75*(OH+AP/14)]*PHAS1*1PHAS2*PCRGLHT*PARP*PTAL 其中 PHAS1=1+HAS PHAS2=1.2*1.4*1.03*1.1=1.90344 PCRGL=0.646+HIT+1.472CRI PARP=1-(8088.68*(1-0.9611*ARP))/[(8088.68*(1-0.9611*ARP))+15232.5] PTAL=1.066
二:毒药的伤害 致命毒药伤害=296+0.12*AP 致伤毒药伤害=231+0.04*AP
设 DPS2=致命毒药的DPS 则 DPS2=(296+0.12*AP)*5/12
设 DPS3=致伤毒药的伤害 PSCR=法术爆击系数 则 DPS3=1/[MS/(PHAS1*PHAS2)]*PHIT*(231+0.04*AP)*(MS*21.4/60)*PSCR*PFLU =PFLU*PHAS1*PHAS2*PHIT*PSCR*21.4*(231+0.04*AP)/60 其中 PSCR=1+0.854*SCR
三:技能的伤害
1,影袭的伤害 对于影袭的各种天赋加成的叠加算法一直不清楚,所以我小小测试了一下。
影袭伤害=[(MH*MS+2.4*AP/14)+180]*天赋加成系数2*破甲系数*野蛮战斗加成系数 =1.04*天赋加成系数*破甲系数*[(MH*MS+2.4*AP/14)+180] =863 863是未触发AP提升类BUFF情况下30次未爆击影袭伤害的平均值 其中 BOSS护甲=10643 护甲常数=15232.5 破甲衰减系数= 1/(10643/(10643+15232.5)*3)=(10643+15232.5)/(10643*3)
=0.8104 ARP=0.3293 AP=4298 MH=6.8 MS=2.2 破甲系数=1-[10643*(1-0.3293*0.8104)/[10643*(1-0.8104*0.3293)+15232.5]] =0.6613
代入上式 天赋加成系数2=863/640.81980352=1.346712 所以这个天赋加成系数我取1.35(该结果不保证正确,但即使不正确也不会对最终结果
有太大影响)。 因此 ss=影袭伤害=1.04*1.35*[(MH*MS+2.4*AP/14)+180]*破甲系数*影袭爆击系数 设 PSSCR=影袭爆击系数 则 PSSCR=1-CRI+2.7192*CRI=1+1.7192*CRI ss=1.404*[(MH*MS+2.4*AP/14)+180]*PARP*PSSCR
2,刺骨的伤害 因为影袭的各种天赋加成用了加法,所以刺骨的加成我也选用加法 天赋加成=1+0.2+0.15=1.35 ev=五星刺骨伤害=[(1977+AP*0.15)+(2231+AP*0.35)]/2*破甲系数*爆击系数*天赋
加成系数3*野蛮战斗加成系数=1.404*(2104+0.25*AP)*PARP*PCRI
根据所有这些数据,建立一个程式来模拟战斗情况。 大部分的算式上面都已经写清楚了,这里就只举一下模拟战斗中技能伤害的部分。
double dmg=0; //技能伤害总和 double ss=0; //单次影袭伤害 double ev=0; //单次五星刺骨伤害 doubte T=0; //预计战斗的总时间 double t=0; //该次战斗已进行了多少时间 double EN=100; //当前能量 double snd=0; //切割BUFF剩余的时间 int CP=0; //当前连击点数 int ar=0; //冲动BUFF剩余的时间 int arcd=0; //冲动CD剩余时间
ss=1.404*((MH*MS+2.4*AP/14)+180)*PARP*PSSCR ev=1.404*(2104+0.25*AP)*PARP*PCRI
void doss() //影袭 { EN=EN-40; CP=CP+1; srand(t); double r1=rand(); if r1<32767*0.5*CRI CP=CP+1; if CP>5 CP=5; dmg=dmg+ss; return; }
void dosnd() //切割 { SND=0; EN=EN-25; srand(t); double r2=rand(); if r2<32767*0.2*CB EN=EN+25; switch(CP) { case 1: snd=14;break; case 2: snd=18;break; case 3: snd=23;break; case 4: snd=27;break; case 5: snd=32;break; default: break; } CP=0; r2=rand(); if r2<32767*0.6 CP=CP+1; return; } void doev() //刺骨 { EN=EN-10; CP=0; srand(t); double r3=rand(); if r3<32767*0.6 CP=CP+1; dmg=dmg+ev; return; }
double dps4() { t=t+1; doss; WHILE t <= T do { t++; if ar>0 ar=ar-1; if ar>0 EN=EN+25 else EN=EN+12.5 //每秒回能量 EN=3*PFLU*PHAS1*PHAS2*PHIT/OS; //每秒副手回能量 EN=EN-(25/120); //剑刃乱舞需要的能量 snd=snd-1; if snd<3 {dosnd();continue;} if arcd==0 {ar=15;continue;} if CP>4 { if EN>=60 {doev();continue;} else continue; } if EN>=65 doss(); } double dps; dps=dmg/T; return dps; }
double DPS,DPS4; DPS4=dps4() DPS=DPS1+DPS2+DPS3+DPS4;
这个DPS就是我们实际能达到的DPS。
当你需要调整属性时,只需要将调整前后的属性分别输入程式,然后比较两者的最终DPS,孰优孰劣一目了然。
PS:吐槽语法的话就免了吧,我上一次跟C++亲密接触的时间已经可以追溯到十年之前了…… 又PS:PART4,这、这、这、这、这、这、这……
|