009 Active Ability
这期教程,我们来讲解分散在战斗系统中的那些特性的发动逻辑。
那么,我们就也不废话了,直接全局搜索“def hasActiveAbility?”这个方法——
![1721303528574.png 1721303528574.png](https://bbs.pokefans.cn/data/attachments/2/2402-96461dc5ea5964a9fffe21aad8b85177.jpg)
![1721303534822.png 1721303534822.png](https://bbs.pokefans.cn/data/attachments/2/2403-a9647b8027fa38c3970a83d4385f15c9.jpg)
也就是说呢,分散在战斗系统中的那些特性,是通过检查hasActiveAbility?这个方法,来发动的。
那我们就随便搜索一个特性来看一下吧,就搜索魔法防守好了——
![1721303548047.png 1721303548047.png](https://bbs.pokefans.cn/data/attachments/2/2404-26b4f33487aee6f7143a255963d596e5.jpg)
![1721303554489.png 1721303554489.png](https://bbs.pokefans.cn/data/attachments/2/2405-cf2a43bea885cc6035038528ada86faf.jpg)
因为除了第一个搜索结果之外,其他的都是跟AI有关的,所以我们要找的就是第一个搜索结果。
另外,本系列教程不会涉及任何AI方面的修改。
双击点进去之后——
![1721303572203.png 1721303572203.png](https://bbs.pokefans.cn/data/attachments/2/2406-294228f6e82927a067aecb65bb4d612a.jpg)
我们找到了一个叫做takesIndirectDamage?的方法。
顾名思义,这个方法就是用来检查是否会受到非直接伤害的。
那么什么是非直接伤害呢?
非直接伤害就是除了技能造成的伤害以外的所有其他伤害,所以技能伤害也叫做直接伤害。
魔法防守的效果是,只会受到技能的伤害,所以在这里检查精灵是否有魔法防守是非常合适的。
检查的逻辑就是,如果有XXX就怎么怎么样,或者如果没有XXX,就怎么怎么样。
对应的就是hasActiveAbility?(:XXX),或者!hasActiveAbility?(:XXX)。
现在,我们再回到hasActiveAbility?这个方法的定义那里。
![1721303594933.png 1721303594933.png](https://bbs.pokefans.cn/data/attachments/2/2407-5d17472223d6e5e3d5b3ea304f69aaca.jpg)
我们可以看到,这个方法是有2个参数的,第一个参数是check_ability,第二个参数是ignore_fainted,并且第二个参数的默认值是false。
因为第二个参数有默认值,所以这个方法可以输入1-2个参数,也就是说,如果第二个参数没有输入,那么第二个参数就会使用默认值,如果输入了第二个参数,那么第二个参数就会使用输入值。
我们可以看一下之前的魔法防守——
![1721303607547.png 1721303607547.png](https://bbs.pokefans.cn/data/attachments/2/2408-20a449edcc95f4bcea1b150b3f5153a2.jpg)
魔法防守这里就只是输入了一个参数,也就是说,此时check_ability = :MAGICGUARD,ignore_fainted = false。
我们再去搜索一下污泥浆——
![1721303623751.png 1721303623751.png](https://bbs.pokefans.cn/data/attachments/2/2409-803e149b632963ab6935d0e9dc8b83f2.jpg)
![1721303631057.png 1721303631057.png](https://bbs.pokefans.cn/data/attachments/2/2410-2cbdacb514187631a725ddf5cea7b823.jpg)
![1721303639232.png 1721303639232.png](https://bbs.pokefans.cn/data/attachments/2/2411-d1f8080ad24f5f4a426b698592986273.jpg)
我们可以看到,这里的话就输入了第二个参数,第二个参数ignore_fainted不再是false,而是true了。
那么这个第二个参数是什么意思呢?
我们可以看第二个参数的名字,第二个参数叫做ignore_fainted,其实就是是否忽略精灵已经濒死的情况,就是说,如果精灵濒死了,是否还会发动特性。
一般来说,精灵濒死了的话,是不能发动特性的,因为精灵本身都已经死了,就更不要说是否有处于活动的特性了,hasActiveAbility这个方法的名字的意思,就是是否有处于活动的某个特性。
所以说,如果你以后想要某个特性在精灵处于濒死时依然会发动,就要把第二个参数也填上,并且要填true,即忽略濒死。
现在我们再回过头来看一下第一个参数——
![1721303665470.png 1721303665470.png](https://bbs.pokefans.cn/data/attachments/2/2412-0a5ec9b38a54823110744a27d0ecadec.jpg)
我们好像看到了两个熟悉的东西——
第一个是,abilityActive?;
第二个是,Array。
我们就先来看第二个Array好了,什么是Array我们之前已经介绍过了,那么看这个代码的意思,难不成第一个参数check_ability还能输入数组不成?
对的,实际上check_ability可以是一个数组,我们来看这里——
![1721303679584.png 1721303679584.png](https://bbs.pokefans.cn/data/attachments/2/2413-f195419b0fe28d8a92ae8bbcf5597e71.jpg)
这是自由者和变换自如的代码,我们都知道,自由者和变换自如就是名字不同,特性的效果是一模一样的。
这里它就是直接这样hasActiveAbility?([:LIBERO, :PROTEAN]),这样的意思是,检查是否有自由者或者变换自如。
也就是说,因为hasActiveAbility?可以直接检查数组,所以我们并不需要这么写user.hasActiveAbility?(:LIBERO) || user.hasActiveAbility?(:PROTEAN),可以直接写user.hasActiveAbility?([:LIBERO, :PROTEAN])。
也就是说,我们以后如果想要做相同效果的特性的话,只要在原本的特性后面加上就好了。
另外,还需要强调一点,我们这里检查其实是hasActiveAbility?的第一个参数,而这第一个参数可以是单独的一个特性,或者特性的数组。
所以,可以这样写hasActiveAbility?(:XXX),或者这样写hasActiveAbility?([:XXX, :YYY, :ZZZ])。
但是不要这样写hasActiveAbility?(:XXX, :YYY, :ZZZ),这是错的,这样写就相当于你现在输入了3个参数,这3个参数分别是:XXX、:YYY和:ZZZ。
这样hasActiveAbility?([:XXX, :YYY, :ZZZ])数组的写法是,[:XXX, :YYY, :ZZZ]这一整个整体是一个参数。
还记得数组该怎么写吗?
不记得的话往前翻翻教程吧。
那这个时候可能就会有同学有疑问了,hasActiveAbility?可以通过检查数组来快速写相同效果的特性,那么特性效果文件里是否也有类似的快速写法呢?
是的,特性效果文件里也有类似的快速写法,我们看这里——
![1721303695003.png 1721303695003.png](https://bbs.pokefans.cn/data/attachments/2/2414-113d54dec11a0ccda2edb48f056988b8.jpg)
这一段代码不是add什么什么了,而是copy,接着后面一个括号,接着写了两个特性,分别是恒净之躯和白色烟雾。
这样写的意思是复制恒净之躯在当前Handler下的效果到白色烟雾。
这样的话,白色烟雾就有了恒净之躯的效果,也就是不会被对手降低能力。
这个时候爱学习的同学可能就又有疑问了,那如果我想要做第三个效果相同的特性该怎么办,可以直接在第二个特性后面加上吗?
答案是,当然可以,我们来看这里——
![1721303708684.png 1721303708684.png](https://bbs.pokefans.cn/data/attachments/2/2415-aa518d7b770bf7734bfd4d45474c9195.jpg)
也就是说,第一个特性后面的特性,都会复制第一个特性的效果。
那么,我们现在回过头来讲之前的第一个熟悉的东西abilityActive?。
这个在之前的教程中已经出现过了,我让大家通过我教的方法自己去寻找答案,我相信你也一定是找到了。
关于这个东西的话,其实也不用说太多,这个主要就是给化学变化气体用的。
这个方法的名字的意思是,特性是否处于活动状态,在有化学变化气体的时候,就是不处于活动状态,在没有化学变化气体的时候,就是处于活动状态。
还记得hasActiveAbility?这个方法的名字的意思吗?
不记得的话,往上面翻一翻吧,我相信你能自己理解的。
那么这期教程就到此为止,下期教程我们将会讲解写特性时的思考逻辑。
感谢阅读。
这期教程,我们来讲解分散在战斗系统中的那些特性的发动逻辑。
那么,我们就也不废话了,直接全局搜索“def hasActiveAbility?”这个方法——
![1721303528574.png 1721303528574.png](https://bbs.pokefans.cn/data/attachments/2/2402-96461dc5ea5964a9fffe21aad8b85177.jpg)
![1721303534822.png 1721303534822.png](https://bbs.pokefans.cn/data/attachments/2/2403-a9647b8027fa38c3970a83d4385f15c9.jpg)
也就是说呢,分散在战斗系统中的那些特性,是通过检查hasActiveAbility?这个方法,来发动的。
那我们就随便搜索一个特性来看一下吧,就搜索魔法防守好了——
![1721303548047.png 1721303548047.png](https://bbs.pokefans.cn/data/attachments/2/2404-26b4f33487aee6f7143a255963d596e5.jpg)
![1721303554489.png 1721303554489.png](https://bbs.pokefans.cn/data/attachments/2/2405-cf2a43bea885cc6035038528ada86faf.jpg)
因为除了第一个搜索结果之外,其他的都是跟AI有关的,所以我们要找的就是第一个搜索结果。
另外,本系列教程不会涉及任何AI方面的修改。
双击点进去之后——
![1721303572203.png 1721303572203.png](https://bbs.pokefans.cn/data/attachments/2/2406-294228f6e82927a067aecb65bb4d612a.jpg)
我们找到了一个叫做takesIndirectDamage?的方法。
顾名思义,这个方法就是用来检查是否会受到非直接伤害的。
那么什么是非直接伤害呢?
非直接伤害就是除了技能造成的伤害以外的所有其他伤害,所以技能伤害也叫做直接伤害。
魔法防守的效果是,只会受到技能的伤害,所以在这里检查精灵是否有魔法防守是非常合适的。
检查的逻辑就是,如果有XXX就怎么怎么样,或者如果没有XXX,就怎么怎么样。
对应的就是hasActiveAbility?(:XXX),或者!hasActiveAbility?(:XXX)。
现在,我们再回到hasActiveAbility?这个方法的定义那里。
![1721303594933.png 1721303594933.png](https://bbs.pokefans.cn/data/attachments/2/2407-5d17472223d6e5e3d5b3ea304f69aaca.jpg)
我们可以看到,这个方法是有2个参数的,第一个参数是check_ability,第二个参数是ignore_fainted,并且第二个参数的默认值是false。
因为第二个参数有默认值,所以这个方法可以输入1-2个参数,也就是说,如果第二个参数没有输入,那么第二个参数就会使用默认值,如果输入了第二个参数,那么第二个参数就会使用输入值。
我们可以看一下之前的魔法防守——
![1721303607547.png 1721303607547.png](https://bbs.pokefans.cn/data/attachments/2/2408-20a449edcc95f4bcea1b150b3f5153a2.jpg)
魔法防守这里就只是输入了一个参数,也就是说,此时check_ability = :MAGICGUARD,ignore_fainted = false。
我们再去搜索一下污泥浆——
![1721303623751.png 1721303623751.png](https://bbs.pokefans.cn/data/attachments/2/2409-803e149b632963ab6935d0e9dc8b83f2.jpg)
![1721303631057.png 1721303631057.png](https://bbs.pokefans.cn/data/attachments/2/2410-2cbdacb514187631a725ddf5cea7b823.jpg)
![1721303639232.png 1721303639232.png](https://bbs.pokefans.cn/data/attachments/2/2411-d1f8080ad24f5f4a426b698592986273.jpg)
我们可以看到,这里的话就输入了第二个参数,第二个参数ignore_fainted不再是false,而是true了。
那么这个第二个参数是什么意思呢?
我们可以看第二个参数的名字,第二个参数叫做ignore_fainted,其实就是是否忽略精灵已经濒死的情况,就是说,如果精灵濒死了,是否还会发动特性。
一般来说,精灵濒死了的话,是不能发动特性的,因为精灵本身都已经死了,就更不要说是否有处于活动的特性了,hasActiveAbility这个方法的名字的意思,就是是否有处于活动的某个特性。
所以说,如果你以后想要某个特性在精灵处于濒死时依然会发动,就要把第二个参数也填上,并且要填true,即忽略濒死。
现在我们再回过头来看一下第一个参数——
![1721303665470.png 1721303665470.png](https://bbs.pokefans.cn/data/attachments/2/2412-0a5ec9b38a54823110744a27d0ecadec.jpg)
我们好像看到了两个熟悉的东西——
第一个是,abilityActive?;
第二个是,Array。
我们就先来看第二个Array好了,什么是Array我们之前已经介绍过了,那么看这个代码的意思,难不成第一个参数check_ability还能输入数组不成?
对的,实际上check_ability可以是一个数组,我们来看这里——
![1721303679584.png 1721303679584.png](https://bbs.pokefans.cn/data/attachments/2/2413-f195419b0fe28d8a92ae8bbcf5597e71.jpg)
这是自由者和变换自如的代码,我们都知道,自由者和变换自如就是名字不同,特性的效果是一模一样的。
这里它就是直接这样hasActiveAbility?([:LIBERO, :PROTEAN]),这样的意思是,检查是否有自由者或者变换自如。
也就是说,因为hasActiveAbility?可以直接检查数组,所以我们并不需要这么写user.hasActiveAbility?(:LIBERO) || user.hasActiveAbility?(:PROTEAN),可以直接写user.hasActiveAbility?([:LIBERO, :PROTEAN])。
也就是说,我们以后如果想要做相同效果的特性的话,只要在原本的特性后面加上就好了。
另外,还需要强调一点,我们这里检查其实是hasActiveAbility?的第一个参数,而这第一个参数可以是单独的一个特性,或者特性的数组。
所以,可以这样写hasActiveAbility?(:XXX),或者这样写hasActiveAbility?([:XXX, :YYY, :ZZZ])。
但是不要这样写hasActiveAbility?(:XXX, :YYY, :ZZZ),这是错的,这样写就相当于你现在输入了3个参数,这3个参数分别是:XXX、:YYY和:ZZZ。
这样hasActiveAbility?([:XXX, :YYY, :ZZZ])数组的写法是,[:XXX, :YYY, :ZZZ]这一整个整体是一个参数。
还记得数组该怎么写吗?
不记得的话往前翻翻教程吧。
那这个时候可能就会有同学有疑问了,hasActiveAbility?可以通过检查数组来快速写相同效果的特性,那么特性效果文件里是否也有类似的快速写法呢?
是的,特性效果文件里也有类似的快速写法,我们看这里——
![1721303695003.png 1721303695003.png](https://bbs.pokefans.cn/data/attachments/2/2414-113d54dec11a0ccda2edb48f056988b8.jpg)
这一段代码不是add什么什么了,而是copy,接着后面一个括号,接着写了两个特性,分别是恒净之躯和白色烟雾。
这样写的意思是复制恒净之躯在当前Handler下的效果到白色烟雾。
这样的话,白色烟雾就有了恒净之躯的效果,也就是不会被对手降低能力。
这个时候爱学习的同学可能就又有疑问了,那如果我想要做第三个效果相同的特性该怎么办,可以直接在第二个特性后面加上吗?
答案是,当然可以,我们来看这里——
![1721303708684.png 1721303708684.png](https://bbs.pokefans.cn/data/attachments/2/2415-aa518d7b770bf7734bfd4d45474c9195.jpg)
也就是说,第一个特性后面的特性,都会复制第一个特性的效果。
那么,我们现在回过头来讲之前的第一个熟悉的东西abilityActive?。
这个在之前的教程中已经出现过了,我让大家通过我教的方法自己去寻找答案,我相信你也一定是找到了。
关于这个东西的话,其实也不用说太多,这个主要就是给化学变化气体用的。
这个方法的名字的意思是,特性是否处于活动状态,在有化学变化气体的时候,就是不处于活动状态,在没有化学变化气体的时候,就是处于活动状态。
还记得hasActiveAbility?这个方法的名字的意思吗?
不记得的话,往上面翻一翻吧,我相信你能自己理解的。
那么这期教程就到此为止,下期教程我们将会讲解写特性时的思考逻辑。
感谢阅读。
最后编辑: