第三章·第1节:逻辑运算基础
主稿:YYL
插件基础逻辑运算及逻辑结构分析插件的逻辑运算,主要是根据lua的规则编写而成。lua的逻辑运算相当方便,使用lua的逻辑运算写宏,相当的方便。
所有这些在编写过程中并不区分字母大小写。
例如:
意思就是:如果“生命值比例小于0.3”,则释放技能“无相诀” 一般来说“中括号”里面的都属于逻辑判断的内容!
而无需判断,直接省略判断语句即可!
例如:
完全省略了判断语句,无需判断即能释放!
1.真假判断在插件中,只有 false 会被判断为假,其他全部会被判断为真。
例:
上例的意思 ,如果在战斗状态, 则释放后撤技能
2.分句间的“且”“或”逻辑运算例句1:
- /Cast [fight,life<0.3]无相诀
复制代码 其中逗号,是“且”运算,表示多个条件都成立
该句的意思是:如果“战斗状态中”并且“生命值比小于0.3”,则释放技能“无相诀”
例句2:
/Cast [life<0.5 ; mana<0.5]徐如林
其中分号,是“或”运算,表示多个条件其中之一成立
这句的意思是:如果“生命值比小于0.5” 或者 “内力值比小于0.5”,则释放技能“徐如林”
例句3:
- /print [fight , tar, ota]
复制代码第一句,是连续三个判断,做“且”运算. 从左到右, 如果遇到值为false的,该判断的返回结果就是false(假). 否则会返回最后一个判断的值
如果[在战斗状态][又存在目标][自身又在读条] 则会返回 [ota]的值,即自身的运功进度。
第二句,连续三个判断,做“或”运算. 从左到右, 如果遇到值为真的 ,就会返回该判断的值, 否则会返回false(假,也是最后一个判断的值)
如果 life<1 为假 , mana<1为真 ,则会返回mana<1的值,即true(真) , 最后一个判断根本不会进行判断。
对于某些较为复杂的语句如何理解呢?例:
/cast [buff: aaa>2 & bbb | ccc & ddd<3 ] 技能x
看起来是不是好复杂!不用怕,教你如何分解
可以看出来句子中,冒号后面的,用“&”“|”拆分后有4个部分
“aaa>2”、“bbb”、“ccc”、“ddd<3”
把这四个部分分别接上都前面的内容“buff:”,再将“&”换成逗号,将“|”换成分号,即:
[buff:aaa>2 , buff:bbb ; buff:ccc , buff:ddd<3]
就变成几个小短句了!就变成我们最熟悉的内容了!
相信你一定很容易就能掌握了!
3.关于优先级例句:
/Cast [fight,life<0.3 ; nofight,mana<0.3] 技能x
中括号的内容如何理解?
根据优先级,“或”运算(分号)的优先级 低于 “且”运算(逗号)的优先级
为了便于理解,用小括号分解中括号的内容即是:
[(fight,life<0.3) ; (nofight,mana<0.3)]
优先级高的逗号先结合,就给他加个括号!
意思就是:如果(fight,life<0.3)或者(nofight,mana<0.3),则释放技能“技能x”
是不是很容易嘛!
关于详细的运算优先级,请参见命令文档。
4.其他的运算除了最基本的或且运算外,超级宏还提供了非运算、大小比较运算、数字五则运算等,
在使用的过程中,注意他们的优先级,弄不明白,可以用前面提到的加括号方法来整理语句,以便理解与运用!
同时,括号可以改变默认的结合优先级,更方便的写成想要的内容!
5. if 结构插件支持标准的IF 结构,支持多层嵌套
例:
/if [fight]
/skill 后撤
/else
/skill 蹑云逐月
/end
上句的意思是: 如果在战斗状态,则释放 [后撤] ,否则释放[蹑云逐月]。
6. 用 ”或” ”且” 结构模拟 if 结构/if [fight]
/var [life] v_a
/else
/var [mana]v_a
/end
上句用到了自定义变量的结构.(详细请参加其他说明文档),
代码的意思就是 如果战斗状态, 则赋值v_a为生命值 ,否则赋值为内力值。
我们可以用逻辑运算来模拟这句代码的意思:
/var [fight , life ; mana] v_a
这句的意思跟上句是一模一样的。
因为根据,插件的运算规则 ,对[fight , life ; mana]进行判断, 由于“且”的结合优先级比“或”高,他就等同于[(fight , life) ; mana]
这样就类似两个分句的或运算,即(fight , life) 或 mana, 由于上面的例子讲到,或运算,返回遇到的第一个真的值,
所以(fight , life)为真就返回他的值, 否则会返回 mana的值(真假与否都会返回)。
fight , life 又是两个语句间的且运算, 且运算,返回第一个假,否则会返回最后一个值
则,如果战斗状态,返回life的值,否则会返回false(假)。
上面的串起来就是 .如果fight 返回life ,否则返回mana,跟if结构的逻辑一模一样。
用 ”或” ”且” 结构模拟 if 结构 的一个例外/var [ fight , horse ; life]v_b
用例5的分析,这句的意思就是 如果fight ,则赋值 horse ,否则 life
但是,如果当fight为真,horse为假的时候. (fight , horse)总体的值为假,则运算结果为life
即horse为假,无论fight的值为何,都会返回life的运算结果,
这时用传统的IF结构才能胜任,如下:
/if [fight]
/var [horse]v_b
/else
/var [life] v_b
/end
7.常见逻辑结构解析/skill [tmbufftime:钟林毓秀<1.5] 钟林毓秀 —第一句示例
/skill [tnombuff:钟林毓秀 ; tmbufftime:钟林毓秀<1.5] 钟林毓秀 —第二句示例
/skill [(tmbufftime:钟林毓秀 ; 0)<1.5] 钟林毓秀 –第三局句示例
第一句 与 第二、三句表示的逻辑原理并不相同
[tmbufftime:钟林毓秀] 返回的是 目标存在归属于自身的该buff的剩余时间,
当目标有该buff的时候就会返回剩余时间, 当没有该buff的时候会返回false
在插件中 false(假) 用来做大小比较/加减乘除余 运算的时候, 会返回false (假)
即 [false < 1.5] 会被判断为假
所以第一句的意思是: 目标存在归属自身的该buff ,且剩余时间小于1.5秒的时候释放钟林毓秀,如果要表示没有该buff,或者该buff时间 小于1.5 秒,
则为第二句 [ tnombuff:钟林毓秀 ; tmbufftime:钟林毓秀<1.5] 用 ”或”运算
但是从代码的简洁度及运算的速度来看,我们可以有更高级的表现方式
第三句 其中的 (tmbufftime:钟林毓秀 ; 0)
根据前面提到的逻辑运算方式 [ false ; 0 ]返回的是第一个遇到的 真,所以他等同于 0
那么这个小分句的意思,就是 如果存在该buff,则返回时间, 不存在则返回0
那么 [ (tmbufftime:钟林毓秀 ; 0)<1.5]的意思就可以表示为,存在该buff的时间小于1.5秒,或者不存在该buff,与第二句,完全一样! 提高 了简洁度,同时,tnombuff 的运算时间远比 一个 ”或” 运算的时间长,也提高了效率!