1.17.2力爆骑输出手法研究及一键输出宏实现

Post Reply
klo6095
Posts: 1
Contact:

1.17.2力爆骑输出手法研究及一键输出宏实现

Post by klo6095 »

一、 理论部分
理论部分不会去研究一个技能到底能打多少伤害,也不讨论装备收益、未命中、偏斜、躲闪等因素的影响,因为这些是几乎不受玩家操作影响的东西。这里只讨论操作可影响部分的伤害收益、损失的数学模型建立,以力爆惩戒骑为例,其中大部分结论是整个游戏通用的。
1. 力爆骑伤害占比
Image
Image
上图是欧服天梯TOP5某两位惩戒骑在帕奇维克战斗中的伤害占比,可以看出,平砍、十字军打击、命令圣印、驱邪术、命令审判是占比较高,奉献、神圣打击占比较低。以下主要讨论占比较高的技能。
2. 平砍
平砍一般情况下是不受玩家操作影响的,但在有风怒的情况下会有所不同。
2.1 平砍的基本模型
假设攻击速度为3s,我将平砍理解为每3秒自动释放一次的技能,无缝衔接,画成图形就是这样:
Image
图中横轴表示时间,纵轴表示累计造成的伤害。实战中每次平砍的伤害不同,我们也更关注秒伤,为了研究方便,假设每次平砍伤害相同,取其期望值(∑伤害事件发生的概率X事件伤害值),并将图形转换为秒伤的形式:
Image
图中横轴表示时间,纵轴为秒伤,每刀平砍造成的伤害为一个矩形框的面积,矩形框的高度为一刀平砍的伤害/攻速(即平砍秒伤),宽度为攻速。
假设平砍时间到了,却因为走位或其他原因导致平砍延迟了,那损失如何计算?
Image
上图中本该在第6秒打出的第三刀平砍延迟到了第8秒,那么这次延迟损失是虚线框的面积,等于平砍秒伤乘以延迟时间。
2.2 风怒图腾对平砍的影响
由自动攻击触发的风怒,如何计算其收益?用图形来理解
Image
图中假设第6秒的平砍触发了一次风怒,用绿色方框来表示,与不触发的情况相比,显然这次触发风怒的收益就是一次平砍的伤害,图形多了一个绿色方块的面积。
如果是用技能来触发风怒呢?在乌龟服中,惩戒骑的十字军打击、命令审判都可以触发风怒,风怒的触发效果是立即进行下一次攻击,我们仍然用图形来理解
Image
假设在第8秒使用了十字军打击触发风怒,本该在第9秒打出打第4刀平砍提前了1秒打出,后续的平砍时间线也发生改变。在讨论收益时,一定是有至少两种情况来作对比,并且只研究一段时间范围内的差异,因为我们往往只关注当下的操作选择在此时此刻是否为最优的选择,只需要考虑在这次操作选择所影响的时间范围内的收益差距。就本例十字军打击触发风怒而言,作为对比的是不触发风怒的情况,时间范围是8~9秒之间(下图黄线与红色虚线之间),8秒之前及9秒之后两者图形面积是一样的(9秒之后假设平砍无限进行下去),不需要纳入讨论,所以相比于不触发风怒,收益等于平砍提前的时间乘以平砍秒伤,可以得到一个结论平砍提前的时间越多,风怒收益越大。
Image
3. 十字军打击
3.1 十字军打击的基本模型
与平砍类似,平砍为每3秒自动释放一次的技能,而十字军打击是每6秒手动施放一次的技能,画成图形就是这样:
Image
图中横轴表示时间,纵轴表示累计造成的伤害。同样,单次伤害取其伤害期望值,将图形转换为秒伤的形式:
Image
图中横轴表示时间,纵轴为秒伤,每次十字军打击造成的伤害为一个矩形框的面积,矩形框的高度为一次十字军打击造成的伤害/十字军打击冷却时间(即十字军打击秒伤),宽度为十字军打击冷却时间。
假设十字军打击冷却好了,却因各种原因延迟了,那损失如何计算?
Image
上图中本该在第12秒打出的第三次十字军打击延迟到了第16秒,那么这次延迟损失是虚线框的面积,等于十字军打击秒伤乘以延迟时间。
3.2 十字军打击使用的时机
由第2.2节已经知道风怒的触发时机会影响收益,所以有风怒图腾时使用十字军打击的时机必然是有讲究的,不可无脑按,举例说明,对比下图中的两种情况:
Image
图中0时刻表示现在,上一刀平砍是在2秒前,下一刀平砍在1秒后,十字军打击CD在0时刻转好,第一种选择是等待1秒,平砍后立刻打出十字军打击,并由十字军打击触发了风怒,第二种选择是立刻打出十字军打击,并由十字军打击触发了风怒。对比两种选择的收益情况,取0到4秒之间为研究对象,第一种选择:一次十字军打击-1X十字军打击秒伤+2X3X平砍秒伤+1X平砍秒伤,第二种选择:一次十字军打击+3X平砍秒伤+1X平砍秒伤+1X平砍秒伤,比较两种选择谁收益高,只需要对比1X十字军打击秒伤与2X平砍秒伤的大小,若前者大,则应选择第二种操作,若后者大则应选择第一种操作,即延迟1秒十字军打击。
在这个例子中已经给出了时间关系,而十字军打击秒伤和平砍秒伤都是由期望值计算的,也应该是常数,所以可以直接比大小,但在实战中,此时此刻你并不知道接下来会发生什么,所以需要列出所有可能的情况,一一求出其伤害期望,并进行对比,由于十字军打击冷却时间与攻击速度不是倍数关系,并且存在延迟的影响,所以每次十字军打击CD转好的时刻距离下一刀平砍的时间长短是不断变化的,当这个时间长度小于某个值时就应该延迟到平砍后打十字军打击,所以需要每次都做判断。
4. 命令圣印
命令圣印是由平砍带出来的附加伤害,不受玩家控制,我们能做的只有尽量保证每一刀平砍都已经挂好命令圣印(不空刀),除非不挂命令能带来更高的收益。命令圣印的触发几率计算公式为0.113*武器速度,其中武器速度为武器面板的速度,与任何加速无关。
5. 驱邪术
驱邪术的基本模型与平砍和十字军打击类似,但不能触发风怒图腾,所以不需要考虑风怒的影响,当驱邪术和十字军打击CD差不多时间转好时由于GCD的存在,可能导致其中一个技能延迟施放,需要对比先放哪个技能收益高,例如下图中
Image
0秒时刻驱邪术CD转好,0.5秒后十字军CD转好,操作1是立刻打驱邪,由于存在1.5秒GCD(图中用直径1.5灰色圆圈表示),十字军打击将会延迟1秒,收益为:一次驱邪数-1X十字军打击秒伤+一次十字军打击,操作2是等打完十字军打击后再用驱邪术,驱邪术将会延迟2秒,收益为:-2X驱邪术秒伤+一次十字军打击+一次驱邪术,本例中只需对比1X十字军打击秒伤与2X驱邪术秒伤大小即可。
在实战中,因为十字军打击施放时机的问题,对比将更加复杂,在没有6T3的情况下,可以简单处理,驱邪术无条件给十字军让路。
6. 命令审判
命令审判的基本模型与其他固定CD的技能类似,但有两点特殊之处
命令审判能触发风怒,所以是否时机同样有讲究;审判没有GCD但释放命令审判后,需要重新挂命令圣印,这导致命令审判的时机选择异常复杂,如果无脑按,很可能导致空刀,或者较低收益,每次都在平砍后立刻打审判会是不错的选择。
7. 其他
关于十字军打击和神圣打击选择问题,翻了许多欧服的log,大多数大佬选择十字军打击:神圣打击=3:1的输出手法,甚至更大的比例,目前我也推荐采用3:1,即神圣威能BUFF断了以后再补神打。
关于圣印舞,这是60级的游戏机制,当由命令圣印切换至其他圣印时,命令圣印的效果仍然会保留大约0.4秒,所以我们可以再平砍前0.4秒内,将命令圣印切换为其他圣印,这样在平砍时会有机会触发两种圣印。力爆骑可以选择切换正义圣印,因为正义圣印的伤害也可以触发风怒图腾,这会提高风怒的触发几率。当前版本的惩戒骑有大量发呆的时间,蓝量支持的话完全有条件进行圣印舞。
关于风怒图腾的冷却时间,在1.17.2版本中,实测风怒图腾存在2秒(官方文档1.5秒,去他妈的)内置CD。
关于技能的优先级,根据以上的分析,其实技能的优先级可以理解为当一个技能CD转好的一瞬间是立刻打还是延迟打的问题,只要对比出各种操作选择带来的伤害收益哪一种期望值最高就选择哪种操作即可,这当中涉及到大量的计算,靠我们人脑肯定是没法瞬间完成的,那么交给电脑就好了,如何实现将在下一部分介绍。
二、 一键宏制作逻辑
在1.12版本中,玩家可以使用判断施法宏,这是制作一键输出宏的基础,后期暴雪发现这样的宏太强大就禁用了。乌龟服是基于1.12版本客户端开发的,自然支持判断施法宏。举例说明什么是判断施法宏,比如我们想实现有神圣威能时打十字军打击没有神圣威能时打神圣打击,可以这样写
if IsBuffActive("神圣威能", "player") then CastSpellByName("十字军打击") else CastSpellByName("神圣打击") end
这就是一个典型的判断施法宏,我们还可以增加许多判断条件,包括理论部分提到的收益对比,这样就能实现实时判断并执行最优操作的目的。
理论部分已经说过技能优先级问题就是当一个技能CD转好的一瞬间是立刻打还是延迟打的问题,那么我们只需要对每个技能单独进行研究即可。实战中的情况总是千变万化,我们需要把所有可能出现的情况先根据游戏机制来进行分类,再一级一级细化分类,最终完成对比并执行操作,下面举例说明。
当十字军打击CD转好我们考虑是否立即施放时,我们会关注此时离下次自动攻击还有多久,也会关注身上是否有命令圣印,也会关注风怒的内置CD是否已经转好,甚至还可能会关注其他技能的CD情况,细想下来要关注的内容太多,这里需要先做一些取舍,从CJQ的伤害占比来看,平砍,十字军打击,命令圣印三者占绝对大头,其他技能占比相对较低,那么在我们研究十字军打击时,可以只关注十字军打击对平砍和命令圣印造成的影响,也就是说驱邪术,审判,奉献等技能CD情况先不去考虑。那么问题就变得稍微简单一点了,首先按此刻风怒是否在内置CD中分为两类,再按是否已有命令圣印分为四类,最后在这四个大类中,按照距离下次自动攻击的时间长短来细分。这样我们就将十字军打击冷却转好时所有可能出现的情况列举出来了。接下来就是对每种情况下我们可以进行的每种操作计算收益,然后判断各操作的收益大小,取最大的来执行操作即可。
说了一堆烧脑的东西,让我们来看看具体怎么做。首先定义需要用到的各个变量
现在的时间:now=GetTime()……GetTime()是游戏自带的函数,它可以获取现在时间,用秒来表示而不是几时几分几秒,可以理解为每天0点这个数值归0,然后每过1秒增大1,一直累加,也就是说最大会出现24*60*60=86400,这是从服务器获取的,与本地时间无关。
下次自动攻击的时间:nextattack= VGAB_Mhr.et……VGAB_Mhr.et这是VGAttackBar插件中的一个变量,代表下一次平砍的时间,安装这个插件即可。
上次自动攻击的时间:lastattack= VGAB_Mhr.st……同样通过VGAttackBar插件获取
攻击速度:atspd= nextattack- lastattack
是否存在命令圣印:socActive=IsBuffActive("命令圣印", "player")……IsBuffActive()由IsBuffActive插件提供的函数,它可以检查单位buff栏是否存在某个buff,返回是或否。
风怒内置CD是否已转好:wfrdy= now-WFtime>2……WFtime是ZYCounter插件中的一个变量,用于记录最近一次触发风怒的时间,当now-WFtime>2时表示风怒已转好。
技能或平砍伤害期望值:ad_aa……平砍;ad_soc……命令圣印;ad_cs……十字军打击.这几个变量应直接赋值,可以查看自己平时打本的伤害平均值,例如ad_aa约为1100,ad_soc约为1200,ad_cs约为1500。
武器速度:wpspd……武器面板速度,与加速无关
带命令圣印的平砍伤害期望值:aa_c=ad_aa+(wpspd*6.8/60)*ad_soc
带风怒带命令圣印的平砍伤害期望值:aa_cw= ad_aa+0.2*(ad_aa+(1-(1-wpspd*6.8/60)*(1-wpspd*6.8/60))*ad_soc)+0.8*(wpspd*6.8/60)*ad_soc
带命令的平砍触发风怒时的伤害期望值:daa_c+ad_aa+ad_aa+(1-(1-wpsp*6.8/60)*(1-wpsp*6.8/60))*ad_soc
然后就可以开始逐个做计算判断
举例一种情况,当风怒已就绪并且有命令圣印时,可以选择立刻打或者等下次平砍后立刻打,如下图
Image
对比这两种选择的收益期望,首先要确定时间范围,取现在到下下次攻击之间,在这段时间中。第一种选择立刻打:如果不触发风怒,收益是:ad_cs+aa_cw;如果触发了风怒,收益是:ad_cs+aa_c+aa_cw*(nextattack-now)/atspd;第一种选择的收益期望值为:0.8*(ad_cs+aa_cw)+0.2*(ad_cs+aa_c+aa_cw*(nextattack-now)/atspd)。第二种选择等平砍后立刻打十字军打击,如果平砍不触发风怒十字军打击也不触发风怒,收益是:aa_c+ad_cs;如果平砍不触发风怒十字军打击触发风怒,收益是:aa_c+ad_cs+aa_c;
如果平砍触发风怒,十字军必然不触发风怒,收益是:daa_c+ad_cs;十字军打击延迟的损失为:-(nextattack-now)*ad_cs/6;第二种选择的收益期望值为:-(nextattack-now)*ad_cs/6+0.8*0.8*(aa_c+ad_cs)+0.8*0.2*(aa_c+ad_cs+aa_c)+0.2*(daa_c+ad_cs)。
比较两种选择的期望值,若第一种大,则立刻施放十字军打击。
这样这种情况下的判断条件就齐全了,写出一行完整的宏:
if SpellReady(“十字军打击”) and socActive and wfrdy and 0.8*(ad_cs+aa_cw)+0.2*(ad_cs+aa_c+aa_cw*(nextattack-now)/atspd)> -(nextattack-now)*ad_cs/6+0.8*0.8*(aa_c+ad_cs)+0.8*0.2*(aa_c+ad_cs+aa_c)+0.2*(daa_c+ad_cs) then CastSpellByName("十字军打击") end
再举例另外一种情况,当风怒已就绪但没有命令圣印时,我们可以选择立刻打十字军打击或者挂上命令后再打,如果选择第一种,计算收益时需考虑下次平砍前能不能挂上命令圣印,所以我们将这种情况再分为两种情况,now+1.5>nextattack和now+1.5<nextattack,1.5是公共CD,实战中因为延迟,将其改为1.7比较稳妥。当now<nextattack-1.7时,我们可以选择立刻打十字军打击或者挂上命令后立刻打,或者挂上命令后再等下次平砍后立刻打,如下图
Image
三种选择的收益分别是:0.8*(ad_cs+aa_cw)+0.2*(ad_cs+ad_aa+aa_cw*(nextattack-now)/atspd);-1.5*ad_cs/6+0.8*(ad_cs+aa_cw)+0.2*(ad_cs+aa_c+aa_cw*(nextattack-now-1.5)/atspd);-(nextattack-now)*ad_cs/6+0.8*0.8*(aa_c+ad_cs)+0.8*0.2*(aa_c+ad_cs+aa_c)+0.2*(daa_c+ad_cs)
当操作选择1>MAX(选择2, 选择2)时,应该立刻打十字军打击,写出一行完整的宏:
if SpellReady(“十字军打击”) and not(socActive) and wfrdy and now<nextattack-1.7 and 0.8*(ad_cs+aa_cw)+0.2*(ad_cs+ad_aa+aa_cw*(nextattack-now)/atspd)>max(-1.5*ad_cs/6+0.8*(ad_cs+aa_cw)+0.2*(ad_cs+aa_c+aa_cw*(nextattack-now-1.5)/atspd),-(nextattack-now)*ad_cs/6+0.8*0.8*(aa_c+ad_cs)+0.8*0.2*(aa_c+ad_cs+aa_c)+0.2*(daa_c+ad_cs) ) then CastSpellByName("十字军打击") end
依次类推,直到写完所有的情况,至此关于十字军打击的施放已经完成。
命令圣印的施放可参考十字军打击的情况来一一列举完成,但审判和驱邪术等伤害占比较低的技能,可以用简单的原则来判断,例如,驱邪术只有在已经有命令圣印,并且距离十字军打击CD大于1.5秒时才使用。
所有技能写完,你的一键输出宏也就制作完毕了。我按此方法制作完成的一键宏https://www.alipan.com/s/T5SMx6KenAD欢迎大家使用,如果想了解更多的细节可以加我好友。
Post Reply