[无情突袭] 用纯理论数据来调整属性
2011-01-06
之前看到那个计算各属性收益情况的帖子时就有过这个念头,后来嫌技能部分的计算太麻烦就没继续下去,今天趁着活动就把前面未完成的部分补补完。
这个帖子的核心思想是:根据自身的属性,来尽量准确的推算出战斗中我们能够制造的伤害,并转化成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,这、这、这、这、这、这、这……
这个帖子的核心思想是:根据自身的属性,来尽量准确的推算出战斗中我们能够制造的伤害,并转化成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,这、这、这、这、这、这、这……
