✓ ESS21仅限 【TA】【特性】009 Active Ability(0718)

TAAAAAAA

天王
成员
2024-06-16
173
1
27
1,110
009 Active Ability

这期教程,我们来讲解分散在战斗系统中的那些特性的发动逻辑。

那么,我们就也不废话了,直接全局搜索“def hasActiveAbility?”这个方法——
1721303528574.png
1721303534822.png
也就是说呢,分散在战斗系统中的那些特性,是通过检查hasActiveAbility?这个方法,来发动的。

那我们就随便搜索一个特性来看一下吧,就搜索魔法防守好了——
1721303548047.png
1721303554489.png
因为除了第一个搜索结果之外,其他的都是跟AI有关的,所以我们要找的就是第一个搜索结果。
另外,本系列教程不会涉及任何AI方面的修改。

双击点进去之后——
1721303572203.png
我们找到了一个叫做takesIndirectDamage?的方法。
顾名思义,这个方法就是用来检查是否会受到非直接伤害的。

那么什么是非直接伤害呢?
非直接伤害就是除了技能造成的伤害以外的所有其他伤害,所以技能伤害也叫做直接伤害。
魔法防守的效果是,只会受到技能的伤害,所以在这里检查精灵是否有魔法防守是非常合适的。

检查的逻辑就是,如果有XXX就怎么怎么样,或者如果没有XXX,就怎么怎么样。
对应的就是hasActiveAbility?(:XXX),或者!hasActiveAbility?(:XXX)。

现在,我们再回到hasActiveAbility?这个方法的定义那里。
1721303594933.png
我们可以看到,这个方法是有2个参数的,第一个参数是check_ability,第二个参数是ignore_fainted,并且第二个参数的默认值是false。
因为第二个参数有默认值,所以这个方法可以输入1-2个参数,也就是说,如果第二个参数没有输入,那么第二个参数就会使用默认值,如果输入了第二个参数,那么第二个参数就会使用输入值。

我们可以看一下之前的魔法防守——
1721303607547.png
魔法防守这里就只是输入了一个参数,也就是说,此时check_ability = :MAGICGUARD,ignore_fainted = false。

我们再去搜索一下污泥浆——
1721303623751.png
1721303631057.png
1721303639232.png
我们可以看到,这里的话就输入了第二个参数,第二个参数ignore_fainted不再是false,而是true了。

那么这个第二个参数是什么意思呢?
我们可以看第二个参数的名字,第二个参数叫做ignore_fainted,其实就是是否忽略精灵已经濒死的情况,就是说,如果精灵濒死了,是否还会发动特性。
一般来说,精灵濒死了的话,是不能发动特性的,因为精灵本身都已经死了,就更不要说是否有处于活动的特性了,hasActiveAbility这个方法的名字的意思,就是是否有处于活动的某个特性。

所以说,如果你以后想要某个特性在精灵处于濒死时依然会发动,就要把第二个参数也填上,并且要填true,即忽略濒死。

现在我们再回过头来看一下第一个参数——
1721303665470.png
我们好像看到了两个熟悉的东西——
第一个是,abilityActive?;
第二个是,Array。

我们就先来看第二个Array好了,什么是Array我们之前已经介绍过了,那么看这个代码的意思,难不成第一个参数check_ability还能输入数组不成?
对的,实际上check_ability可以是一个数组,我们来看这里——
1721303679584.png
这是自由者和变换自如的代码,我们都知道,自由者和变换自如就是名字不同,特性的效果是一模一样的。
这里它就是直接这样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
这一段代码不是add什么什么了,而是copy,接着后面一个括号,接着写了两个特性,分别是恒净之躯和白色烟雾。
这样写的意思是复制恒净之躯在当前Handler下的效果到白色烟雾。
这样的话,白色烟雾就有了恒净之躯的效果,也就是不会被对手降低能力。

这个时候爱学习的同学可能就又有疑问了,那如果我想要做第三个效果相同的特性该怎么办,可以直接在第二个特性后面加上吗?
答案是,当然可以,我们来看这里——
1721303708684.png
也就是说,第一个特性后面的特性,都会复制第一个特性的效果。

那么,我们现在回过头来讲之前的第一个熟悉的东西abilityActive?。
这个在之前的教程中已经出现过了,我让大家通过我教的方法自己去寻找答案,我相信你也一定是找到了。
关于这个东西的话,其实也不用说太多,这个主要就是给化学变化气体用的。
这个方法的名字的意思是,特性是否处于活动状态,在有化学变化气体的时候,就是不处于活动状态,在没有化学变化气体的时候,就是处于活动状态。
还记得hasActiveAbility?这个方法的名字的意思吗?
不记得的话,往上面翻一翻吧,我相信你能自己理解的。

那么这期教程就到此为止,下期教程我们将会讲解写特性时的思考逻辑。

感谢阅读。
 
最后编辑:

在线成员

现在没有会员在线。

论坛统计

主题
458
消息
2,072
会员
2,854
最新会员
jiuchuan

关于我们

  • 宝可梦以及其他相关名称是任天堂的商标,版权归宝可梦公司所有。宝可饭堂是一个同人游戏中文社区,不隶属于宝可梦公司。在宝可饭堂上的粉丝游戏亦未获得其授权,请支持正版游戏。
© 2022- pokefans.cn
点此延长宝可饭堂生命