之前看到那个计算各属性收益情况的帖子时就有过这个念头,后来嫌技能部分的计算太麻烦就没继续下去,今天趁着活动就把前面未完成的部分补补完。

这个帖子的核心思想是:根据自身的属性,来尽量准确的推算出战斗中我们能够制造的伤害,并转化成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,这、这、这、这、这、这、这……