012 Mold Breaker
这期教程,我们来讲解Mold Breaker,也就是破格。
就我个人来说,我并不觉得破格需要专门的一篇教程来讲解,但是毕竟破格也算是比较特别的一个,或者说一类特性了,而且和化学变化气体还可能会混淆,所以我们就稍微讲一下吧。
那么首先,我们先来回顾一下破格类特性的效果,效果是,攻击时,无视其他精灵的特性。
可能你会感到疑惑,不是无视对手的特性嘛,怎么变成无视其他精灵的特性了?
实际上,破格其实是会无视队友的特性的。
但是,这并不是我们这里要讲解的重点,到底要不要无视队友的特性,无非就是看想不想,再改一下代码就完事了。
重点是,破格是在攻击时生效的,那么具体是哪里呢?
我们来看这里——


找到这个方法——

这个是使用技能时调用的方法,我们往下翻——

可以看到,在第219行时,开始了破格效果。
那么破格效果什么时候结束呢?
我们往下翻,找到这里——

我们可以看到,在第512行的时候,破格效果结束。
也就是说,首先,破格效果有没有,由@battle.moldBreaker来决定,@battle.moldBreaker是true,就是有破格效果,@battle.moldBreaker是false,就是没有破格效果;
其次,破格效果只会开启一段时间,如果有破格效果的话,破格只会影响到第219行到第512行之间的代码。
关于@battle.moldBreaker是什么,这个我们之前在讲基于battle的变量的时候就讲过了,它就是一个battle的变量,用来记录是否破格,没有其他过多要说的。
那么,@battle.moldBreaker到底由什么决定呢?
我们可以看第219行,@battle.moldBreaker = hasMoldBreaker?,也就是说,@battle.moldBreaker到底是true还是false,是由hasMoldBreaker?决定的。
也就是说,hasMoldBreaker?是true,@battle.moldBreaker就是true,hasMoldBreaker?是false,@battle.moldBreaker就是false。
那么hasMoldBreaker?到底是什么呢?
这里我再次强调一下,当你想要知道一个方法到底是什么的时候,你可以全局搜索这个方法,格式是def xxx。
那我们就搜索看看——



可以非常清楚的看到,hasMoldBreaker?到底是true还是false,就是看使用技能的这个精灵是否有某一个特性。
也即是说,如果你想让某个特性具有破格效果,只要在这里加上这个特性就好了。
讲了这么多,到目前为止好像都是关于是否有破格的部分,那么破格到底是如何无视其他精灵的特性的呢?
前面我们已经说了,是否破格由@battle.moldBreaker来记录,那么,我们其实只需要搜索一下battle.moldBreaker,看一下它都是什么时候被检查就好了——


可以看到,搜索出来的结果非常多,也就是说,破格效果的实现非常复杂。
我们来看两个地方,第一个地方——

我们可以看到,破格是否无视某些特性,就是在检查对应的特性的时候,额外再多检查一下是否有破格。
这里的话,是先检查漂浮,再有处于活动的漂浮的情况下,再检查是否破格。
注意,我这里写的是,处于活动的漂浮,漂浮什么时候处于活动呢,一般来说,就是在场上没有化学变化气体的时候。
也就是说,化学变化气体和破格对特性的影响是完全不一样的。
一个是让特性是否处于活动,另一个是当特性活动的时候额外检查是否破格。
我们接着看第二个地方——

这是免疫类特性接入战斗系统中的地方。
免疫类特性就是指那些被攻击时不会受到伤害的特性,比如说引水,避雷针,等等。
我们可以看到,在这个方法的最开始,就先检查了是否有破格,有破格的话这个方法就直接返回false了。
也就是说,在有破格的时候,就相当于MoveImmunity这个Handler根本就没有接入战斗系统中。
这里的话可能有同学会无法理解,为什么就相当于MoveImmunity这个Handler根本就没有接入战斗系统中呢?
这是因为这里return了,return了一个false。
当return了,也就是返回了的时候,就不会再继续执行return后面的代码了。
跟我们前面讲过的next,是差不多的。
那这两个地方的话,就是破格如何无视特性的逻辑,当然逻辑其实是一样的,就是检查一下是否有破格。
最后,也就是说呢,如果你要确认某一个特性是否会被破格无视,你就需要单独去确认那一个,或者那一类特定的特性,没有轻松的办法。
那么这期教程就到此为止,下期教程我们将会讲解特性效果文件里面所有的Handler都是什么。
感谢阅读。
这期教程,我们来讲解Mold Breaker,也就是破格。
就我个人来说,我并不觉得破格需要专门的一篇教程来讲解,但是毕竟破格也算是比较特别的一个,或者说一类特性了,而且和化学变化气体还可能会混淆,所以我们就稍微讲一下吧。
那么首先,我们先来回顾一下破格类特性的效果,效果是,攻击时,无视其他精灵的特性。
可能你会感到疑惑,不是无视对手的特性嘛,怎么变成无视其他精灵的特性了?
实际上,破格其实是会无视队友的特性的。
但是,这并不是我们这里要讲解的重点,到底要不要无视队友的特性,无非就是看想不想,再改一下代码就完事了。
重点是,破格是在攻击时生效的,那么具体是哪里呢?
我们来看这里——


找到这个方法——

这个是使用技能时调用的方法,我们往下翻——

可以看到,在第219行时,开始了破格效果。
那么破格效果什么时候结束呢?
我们往下翻,找到这里——

我们可以看到,在第512行的时候,破格效果结束。
也就是说,首先,破格效果有没有,由@battle.moldBreaker来决定,@battle.moldBreaker是true,就是有破格效果,@battle.moldBreaker是false,就是没有破格效果;
其次,破格效果只会开启一段时间,如果有破格效果的话,破格只会影响到第219行到第512行之间的代码。
关于@battle.moldBreaker是什么,这个我们之前在讲基于battle的变量的时候就讲过了,它就是一个battle的变量,用来记录是否破格,没有其他过多要说的。
那么,@battle.moldBreaker到底由什么决定呢?
我们可以看第219行,@battle.moldBreaker = hasMoldBreaker?,也就是说,@battle.moldBreaker到底是true还是false,是由hasMoldBreaker?决定的。
也就是说,hasMoldBreaker?是true,@battle.moldBreaker就是true,hasMoldBreaker?是false,@battle.moldBreaker就是false。
那么hasMoldBreaker?到底是什么呢?
这里我再次强调一下,当你想要知道一个方法到底是什么的时候,你可以全局搜索这个方法,格式是def xxx。
那我们就搜索看看——



可以非常清楚的看到,hasMoldBreaker?到底是true还是false,就是看使用技能的这个精灵是否有某一个特性。
也即是说,如果你想让某个特性具有破格效果,只要在这里加上这个特性就好了。
讲了这么多,到目前为止好像都是关于是否有破格的部分,那么破格到底是如何无视其他精灵的特性的呢?
前面我们已经说了,是否破格由@battle.moldBreaker来记录,那么,我们其实只需要搜索一下battle.moldBreaker,看一下它都是什么时候被检查就好了——


可以看到,搜索出来的结果非常多,也就是说,破格效果的实现非常复杂。
我们来看两个地方,第一个地方——

我们可以看到,破格是否无视某些特性,就是在检查对应的特性的时候,额外再多检查一下是否有破格。
这里的话,是先检查漂浮,再有处于活动的漂浮的情况下,再检查是否破格。
注意,我这里写的是,处于活动的漂浮,漂浮什么时候处于活动呢,一般来说,就是在场上没有化学变化气体的时候。
也就是说,化学变化气体和破格对特性的影响是完全不一样的。
一个是让特性是否处于活动,另一个是当特性活动的时候额外检查是否破格。
我们接着看第二个地方——

这是免疫类特性接入战斗系统中的地方。
免疫类特性就是指那些被攻击时不会受到伤害的特性,比如说引水,避雷针,等等。
我们可以看到,在这个方法的最开始,就先检查了是否有破格,有破格的话这个方法就直接返回false了。
也就是说,在有破格的时候,就相当于MoveImmunity这个Handler根本就没有接入战斗系统中。
这里的话可能有同学会无法理解,为什么就相当于MoveImmunity这个Handler根本就没有接入战斗系统中呢?
这是因为这里return了,return了一个false。
当return了,也就是返回了的时候,就不会再继续执行return后面的代码了。
跟我们前面讲过的next,是差不多的。
那这两个地方的话,就是破格如何无视特性的逻辑,当然逻辑其实是一样的,就是检查一下是否有破格。
最后,也就是说呢,如果你要确认某一个特性是否会被破格无视,你就需要单独去确认那一个,或者那一类特定的特性,没有轻松的办法。
那么这期教程就到此为止,下期教程我们将会讲解特性效果文件里面所有的Handler都是什么。
感谢阅读。