|
|
再未有其他游戏像RO一样用aspd这个参数表述人物的攻击速度 最近终于在日本各网站凑齐了aspd的公式 可以发表一篇全面的文章了
先贴公式 ASPD = 200 - {[(250 - AGI - DEX/4)/250] x (200 - BaseASPD)}
APS(attack per second每秒攻击次数)=50/(200-ASPD)
ASPD"(使用加速技能如加速药后)=ASPD+(200-ASPD)*t%(加速因子如波水为15%)
第三个是凭记忆的 若有不对敬请谅解
一部分日服网站认为 aspd保留至小数点后一位 且RO一次最短攻击时间需要0.02秒 另外 目前官服最高aspd锁定为190
很明显的看出 攻击威力是跟APS直接相关的 而且是线性关系 我们改写一下公式 为什么改写看完就明白了
APS=1/[(200-ASPD)*0.02]
在此 我们改写全部公式 令ADT(attack delay time)=200-ASPD 因为AGI和DEX/4的作用相当 且不管配点可能与否 一个agi100 dex100的人 就当作是agi125来计算是相同的 令AGI"(等效AGI)=AGI+DEX/4
全部公式变成
ADT=(1-AGI"*1/250)* BaseADT (1)
APS=1/(ADT*0.02) (2)
使用加速技能/道具后 ADT"=ADT(1-t%) t为加速因子 (3)
看看上边 公式是不是简单多了
引入ADT的意义是什么呢? 写过计算机程序的人应该有这个概念 如果你是gravity的程序员 我现在要你写一个决定攻击频率的程序 你如何写呢? 你可以直接写某个函数让电脑1秒钟演算15次还是20次攻击么? 实现起来很困难吧 正常人类大概都会使用一个延时的函数或者循环 你要0.1秒攻击一次? ok我写一个函数造成延时0.02秒 每循环或者调用5次就调用一次演算攻击的函数就是了 很简单的方法
若RO最小时间单元设定为0.02秒 那么每次攻击延迟过后隔 ADT个循环之后发出一次攻击动作 也就是每ADT*0.02秒发出一次攻击
熟悉法师的人再仔细看看公式(1) 有没有似曾相识?
ADT=(1-AGI"*1/250)* BaseADT (1)
施法时间=(1-DEX*1/150)*基础施法时间 (4)
这并不是巧合 同一个小组在设计一个系统的时候往往使用类似形式的公式 或许因为ADT跟攻击速度正好是反比的 gravity认为不够直观 才取了200-ADT作为ASPD的代表吧 总之ASPD看着越大 攻击速度就越高
彻底抛弃ASPD而采用ADT的概念 能使很多事情变得清晰而自然 你的aspd175 我的aspd180比你高5点 嗯 不错 爽 但是高5点aspd差了多少呢? 你能说出来么? 现在好了 看看公式(2) ADT和攻击速度是完全反比的 你的ADT25 我的ADT20 我的攻击频率或者说攻击速度是你的25/20=1.25倍 也就是 单位时间造成的伤害是你1.25倍 BINGO!
再来看看武器的选择 把公式(1)带入公式(2) APS=1/{0.02*[(1-AGI"*1/250)* BaseADT]} 在人物一定的情况下 APS=1/(k*BaseADT) 换句话说 APS也跟武器的基础ADT成反比 拿常见的铁匠武器选择问题来说 单手斧BaseASPD=135 BaseADT=65 炼锤 BaseASPD=132.5 BaseADT=67.5 因此 无论体铁敏铁均铁打造铁 攻击力相同的情况下单位时间内造成的伤害 使用单手斧是炼锤的67.5/65=1.04倍 比较两种武器直接攻击力再乘这个系数就可以了 次式也同时清楚的说明武器的选择与agi无关
接着看看加速药 喝了波水之后单位时间内伤害增加了多少呢? 15%? APS"=1/ADT*(1-t%)*0.02 t=15代入得 APS"=APS*1/0.85=1.18*APS 也就是说 单位时间伤害约增加了18% 而2HQ和速度激发则实际增加了约43%的单位时间伤害 你现在明白铁匠练级该开凶砍还是速度激发了么? (一般铁匠只能常驻一样且不考虑怪物减算防御)
最后我们来讨论aspd取整问题 大家都知道gravity设计程序很爱取整的 在这一项上也不例外 由公式 APS=1/(ADT*0.02) 和 APS=1/[(200-ASPD)*0.02] 可以看到 延时函数的调用次数ADT 必须是整数 (以前有人提出过 施法时间=(1-DEX*1/150)*基础施法时间 的最小可分辨时间单元也是0.02秒 所以dex也要凑整5的理论 但是没有验证 个人认为重力社实在没有必要写两个延时函数 除非有特殊理由好的程序员一般不会这么做 所以有可能施法和攻击的最小时间单元相同 考虑到零偷的最小几率0.02%....重力社实在很喜欢0.02这个数 不过有什么内在联系也说不定)
感谢点点滴滴给出的实测和其他网友提供的KE封包 我个人现在基本认为APS=1(ADT*10*0.002) 也就是说 ADT或者是ASPD小数点后保留一位有效数字 从KE的封包来看系统间传送的数据就是ADT*10=(200-ASPD)*10 ASPD只是一个显示数据 很可能运算中根本不碍它的事 ASPD=200-ADT 这个公式里的200实际上是随意定的罢了 如果有一天gravity的程序员心血来潮把所有公式里的200改成300 各位的aspd会显示成275这样 但实际的攻击速度根本没有任何改变 起作用的是锁定ASPD190 或者说是锁定ADT为10 也就锁定了攻击速度的极限是每秒5下 这也从侧面说明了ASPD的数字基本上就是一无用的概念 仅仅拿来看的
若ADT如KE封包和实测中描述的那样是精确到小数点后一位的话 那么实际上可能性比较大的就是运算中对10*ADT那个变量取整 配人物点的时候仍然还要凑整 即是对ADT=BaseADT*(1-AGI"/250) 两边都乘10凑整 也即是 10*ADT=BaseADT*(10-AGI"/25)凑整 对盗贼拿短剑的情形 Base ADT=50 右边为500-2AGI"=500-2AGI-DEX/2 DEX是偶数刚好为整数 而对炼金拿钝器的情形 右边写成 10*ADT=135*(10-AGI"/25)=1350-27*(4agi+dex)/20 也就是说 dex+4agi需要是20的倍数
但是这里略有不同,我们需要ADT尽量小,若在整数的基础上再增加一点dex 则10*ADT则会变成 1799.9XXX这样 小数部分将要舍去 所以在炼金的例子里有可能dex+4agi除20余1是最合算的 重力社确实在给我们发红利 但这个红利实在是太小了 以aspd189.9-aspd190.0来算 增加的0.1aspd提升了0.1/(200-190)=1%的每秒伤害 由于常见的aspd大约是180上下 这时的额外伤害就只有0.5% 估计还不如网络延迟的影响大 基本可以忽略掉 因此结论就是 配点的时候agi和dex随便点就好了  这里的问题是0.002秒的时间单元太小了 程序里基本体现不出来 一个比较合理的做法是如点点所说用不均匀的攻击把"丢掉"的攻击次数补回来 这个似乎跟我们平时练功的直观也比较吻合
本文主要是为了提出ADT的概念 让攻击速度的概念更加直观和容易比较而已 其他的有待证实 |
|
|