✓ ESS21仅限 【TA】【特性】005 Call(0718)

TAAAAAAA

天王
管理成员
2024/06/16
241
4
36
1,270
005 Call

这期教程我们来看一下怎么把Handler接入到战斗系统中。

在之前的教程中,我们说过,绝大部分的特性相关的代码在特性效果文件中,还有一部分特性的代码分散在整个战斗系统中。
其中,特性效果文件中的代码需要接入到战斗系统中才能够使用。

那么,怎么接入呢?
我们以EndOfRoundEffect这个Handler为例,首先,找到这个Handler对应的参数方法——
1719826706390.png
接着,全局搜索self.后面的、括号前面的内容,也就是带有trigger的部分,即triggerXxxxXxxx,这里的话就是,triggerEndOfRoundEffect。
1719826720308.png
这是搜索结果,这个Handler倒还好,总共只有4个搜索结果,我们其实很容易就能够发现,我们要找的应该是第一个搜索结果。
因为第二个搜索结果和第四个搜索结果显然不是,因为它们是跟item有关的,item就是物品,而我们这里是特性,特性是ability,所以显然不符合;
而第三个搜索结果就是这个参数方法本身,所以只能是第一个搜索结果。
那么我们就双击点进去看一下——
1719826734402.png
可以发现,就是通过Battle::AbilityEffects.triggerEndOfRoundEffect(battler.ability, battler, self)这一行代码,把EndOfRoundEffect这个Handler接入到了战斗系统中。
关于Battle::AbilityEffects.triggerEndOfRoundEffect(battler.ability, battler, self)这行代码,我们详细来看一下——
Battle::AbilityEffects,这个没什么好说,之前说过了;
triggerEndOfRoundEffect,这个其实也没什么好说,就是Handler对应的参数方法的名字;
(battler.ability, battler, self),这个就是传递的参数,我们需要详细看一下——
这里传递了3个参数,分别是battler.ability,battler和self;
我们对比一下参数方法里的参数,参数方法里的是ability,battler和battle。

这里的话逻辑其实是这样的——
这里传递了3个参数到参数方法里,也就是说,参数方法里的参数和这里传递的参数的对应关系是这样的——
ability = battler.ability
battler = battler
battle = self
顺序是固定的,第一个参数就是对应第一个,第二个对应第二个,第三个对应第三个,这是不会变的。

所以我们需要先搞清楚,这里传递的参数里面的battler指什么,我们看这里——
1719826754902.png
这里的意思是,通过精灵的出手顺序,对每一个精灵做同样的处理。
所以这里的battler其实指的就是,当前正在做处理的精灵本身,这也解决了我们上期节目遗留下来的问题。
所以battler.ability指的就是,当前正在做处理的精灵的特性。
那么self指什么呢?
把文件拉到最上面——
1719826770790.png
我们可以看到class是Battle,class又叫做类,所以这里的self指的就是battle。
self其实指的就是自身,只不过这里的自身指的是battle。

我们再看一下Battle::AbilityEffects.triggerEndOfRoundEffect(battler.ability, battler, self)所在的方法是什么——
1719826783549.png
所以,也就是说,通过Battle::AbilityEffects.triggerEndOfRoundEffect(battler.ability, battler, self),将EndOfRoundEffect接入到了战斗系统中的pbEndOfRoundPhase方法里。
每一次pbEndOfRoundPhase被Call的时候,也就是pbEndOfRoundPhase被调用的时候,EndOfRoundEffect也会被调用。
而pbEndOfRoundPhase这个方法,顾名思义,非常直白,就是在每回合的回合结束时会调用这个方法。

所以,把Handler接入到战斗系统中其实并不难,你只要照着格式来就好了,难的是应该要接入到战斗系统中的哪里。
这需要你对整个战斗系统有非常清晰的认知,如果接入错了地方,那么就会产生各种潜在的问题。
另外,你也不要问我为什么格式是这样的,你没有必要了解,你只要照着格式就好了,如果你真的想要了解的话,请自行谷歌。

最后,我们来把新建的StartOfRoundEffect接入到战斗系统中——
首先,全局搜索def pbCommandPhase——
1719826795983.png
1719826803659.png
接着,将StartOfRoundEffect接入——
1719832768387.png
你不要问我为什么在这里接入,前面已经说过了,“需要你对整个战斗系统有非常清晰的认知”,如果你有清晰的认知,你自然会知道该在哪里接入。

这样就把StartOfRoundEffect接入到战斗系统中了,我们可以来测试一下,首先用活力焕发来测试。

在前面的教程中,我们已经完成了活力焕发的代码部分,但是这还不是全部,我们还需要在PBS里添加特性。
PBS里存放了游戏中的各种数据,PBS所在的文件夹是\Pokemon Essentials v21.1 2023-07-30\PBS,因为我们这里是特性,所以打开这个——
1719826834754.png
接着按照它的格式,在最下面添加活力焕发。
1719826846576.png
因为我现在用的是真的纯净版,也没安装字体,无法显示中文,所以我这里就写英文了,你的话在Name和Description那里直接写中文就好了。
Name就是特性的名字;Description就是特性的描述。

那么我们现在编译一下游戏,进入游戏中查看一下——
通过Debug,也就是调试模式,给随便一只精灵分配活力焕发——
1719826861235.png
1719826870882.png
没有什么问题,接着进入到战斗中看一下,特性是否会正确发动——
1719826883475.png
1719826891393.png
没什么问题,我们继续往下看,随便使用一个技能,看看第二个回合的回合开始时特性是否会发动——
1719826906338.png
注意看皮卡丘的HP,被对面妙蛙种子打了,所以HP减少了,这确实是第二个回合,特性也正确发动了。

这说明,我们把StartOfRoundEffect这个Handler正确接入到战斗系统中了,同时,我们写的活力焕发的代码也是没有问题的。
那么,以后如果你想要写一些在回合开始时会发动的特性的话,就都可以直接写到StartOfRoundEffect里就好了。

视频预览(0701)——

浏览附件2024-07-01 19-40-53.mp4
 

TAAAAAAA

天王
管理成员
2024/06/16
241
4
36
1,270
现在,我们再来看第二个例子——
这是我优化的ES的代欧奇希斯的手动选择变化形态功能的代码(原地址:https://bbs.pokefans.xyz/threads/205/),将上面这一段代码加到def pbCommandPhase上面——
1719836068496.png

我们尝试一下,只有拥有某个特定的特性的代欧奇希斯才能变化形态——
1719827148096.png
1719836088156.png

pbDeoxysFormChanging这个方法我就不解释了,请自行研究理解,Formless这个特性的话我还是稍微说一下吧。
这个特性只有battle.pbDeoxysFormChanging(battler)这一行,那么为什么pbDeoxysFormChanging前面是battle,难道不是应该对battler调用这个方法吗?
这是因为pbDeoxysFormChanging这个方法是写在class Battle里的,所以你是调用的battle里的方法,而pbDeoxysFormChanging后面的括号里的参数,才是指定了对处于战斗中的哪只精灵进行处理,在这里是battler,也就是自身,第二个参数true是用来控制特性条的显示的,如果不写第二个参数,那么当特性发动时,就不会显示特性条。
这边还需要额外说一点,这个“.”,点,就是调用的意思,点的前面是什么,就是对什么调用点后面的方法。
另外你可能还注意到了,class Battle这里的Battle是首字母大写的,而特性里的battle却不是首字母大写的,为什么呢?
这个暂时你不需要知道,也没有必要知道,你只需要知道,它就是这样的,就好了。
另外,还需要强调一点,在Ruby里面是严格区分大小写的,Battle和battle完全就是两个东西,所以你自己在写代码的时候,一定要认真仔细,不要犯一些低级错误。

什么是Ruby?
Ruby是一种编程语言,你不需要了解太多,你只需要知道,ESS里面的代码,是用Ruby写的,这就够了。

接着,我们回来,进入游戏中测试一下——
1719827166931.png
压迫感自然是无法变换形态的,这个就不需要对比测试了,我们只需要测试一下当特性是Formless是,代欧奇希斯能否变换形态——
1719827178699.png
1719827186828.png
1719827194954.png
1719827202089.png
没有什么问题,成功了。
你现在看到口口口口的,其实就是我前面说的,因为我没安装字体,所以显示不了中文,你的话如果是安装了字体并且更换了显示的字体的话,应该是能正确显示的。
关于怎么在游戏中显示中文,请自行去查看网站里的基础教程。

另外,如果你真的要用特性来实现这个功能的话,测试的时候不要直接给代欧奇希斯这个特性,而是在PBS文件夹里的pokemon.txt里把代欧奇希斯的特性改成这个特性,因为改变形态之后会重新应用物种的特性,所以如果你是直接给了代欧奇希斯这个特性,那么在改变形态之后,新形态的代欧奇希斯就会变成PBS里定义的特性了。

最后还要提醒一点,不要犯一个愚蠢的小错误,那就是新增加了代码之后,却不保存。
请养成随时使用快捷键Ctrl + S进行保存的好习惯,只有保存了,你修改的代码才会生效。

视频预览(0701)——

浏览附件2024-07-01 20-19-03.mp4

下一期教程,我们将会再来做一个接入新的Handler的实践。

感谢阅读。
 

Mulpha

宝可梦训练家
2024/08/13
9
1
1
180
26
逐步学习,这里提醒一下其他学习的朋友,def pbCommandPhase在DBK中重写了,需要在插件里去接入StartOfRoundEffect
 

TAAAAAAA

天王
管理成员
2024/06/16
241
4
36
1,270
逐步学习,这里提醒一下其他学习的朋友,def pbCommandPhase在DBK中重写了,需要在插件里去接入StartOfRoundEffect
跟着教程来现阶段并没有DBK。
 

在线管理员

在线成员

最新帖子

论坛统计

主题
517
消息
2,352
成员
3,007
最新成员
ZQLdw