[打印本页]
作者: 青墨白宣 时间: 2019-03-21 17:28
标题: 官方宏条件判定机制及测试验证
本帖最后由 青墨白宣 于 2019-03-21 17:32 编辑
因为最近有朋友又来问这个判定顺序的问题,以及看到一些宏写的稍有瑕疵,所以来发这个贴,首先上结论
[attach]35292[/attach]
文字版结论(防抽图):
官方宏的条件判定为由右向左依次判定
即:
A|B&C&D=A|(B&C&D)
A&B|C&D=A&(B|(C&D))
A&B&C|D=A&B&(C|D)
A&B|C|D=A&(B|C|D)
....
很多人在写宏,尤其是一条很长的多条件的宏的时候会有一个误区,就是官方宏的条件判定是&优先(也有人认为是|优先的,听说过没见过),但实际上官方宏的判定机制里不论&还是|都不存在优先级,而是简单粗暴的从右向左判定,即A@B@C@D=A@(B@(C@D)),@可为任意的&或|。
验证如下
建立一个宏,条件为A&B|C&D
共计4种假设
1.假设&优先,则其等价于(A&B)|(C&D)
2.假设|优先,则其等价于A&(B|C)&D
3.从右向左判定,则其等价于A&(B|(C&D))
4.从左向右判定,则其等价于((A&B)|C)&D
首先,令A、B不满足,C、D满足,则有结果
1.可以释放
2.不能释放
3.不能释放
4.可以释放
实测结果为不能释放,排除1、4,宏如图
[attach]35293[/attach]
(文字版防抽图)
/cast [buff:撼如雷&buff:清新静气|nobuff:袖气&nobuff:般若诀] 任意技能
接下来对比2和3
2.A&(B|C)&D=(A&B&D)|(A&C&D)
3.A&(B|(C&D))=(A&B)|(A&C&D)
将条件修改为A、B满足,C、D不满足,则有结果
2.不能释放
3.可以释放
实测结果为可以释放,排除2,结论为条件由右向左依次判定,宏如图
[attach]35291[/attach]
(文字版防抽图)
/cast [nobuff:撼如雷&nobuff:清新静气|buff:袖气&buff:般若诀] 任意技能
※测试前把身上的清新袖气般若雷都点掉
最后在放一次结论
官方宏的条件判定为由右向左依次判定
(以下是题外话,一种特例情况,类似的情况可能会出现在苍云宏、古老的焚影多段宏或者古老的莫问多段宏里)
/cast [rage>20&bufftime:血怒<7|rage>40&bufftime:坚定<6.6] 盾飞
由前面的测试过程我们知道,在A&B|C&D的场合下,&优先和从右向左是两种完全不同的结论,但这条宏却实现了&优先的结果,这是因为:
将宏详细拆分,其结果为:A&B|C&D=A&(B|(C&D))=(A&B)|(A&C&D)
套到该宏中,即其结果为:
/cast [rage>20&bufftime:血怒<7] 盾飞
/cast [rage>20&rage>40&bufftime:坚定<6.6] 盾飞
此时,条件C[rage>40]覆盖了条件A[rage>20],即条件A在这里变成了无作用条件,于是化简后为
/cast [rage>20&bufftime:血怒<7] 盾飞
/cast [rage>40&bufftime:坚定<6.6] 盾飞
实现了(A&B)|(C&D)的效果
类似的,这种以高级条件覆盖低级条件实现&优先的方法(因为从右向左很难用一条语句判定完(A&B)|(C&D))可以应用于能量值(rage、energy、qidian、life、mana)上,还可以用于buff持续时间上(bufftime),这些需要大家自己去进行开发。