106 lines
4.8 KiB
ReStructuredText
106 lines
4.8 KiB
ReStructuredText
.. SPDX-License-Identifier: GFDL-1.3-or-later
|
||
|
||
创建新技能
|
||
==========
|
||
|
||
fk体量实在太小,只有标包,欲玩到更多技能,还是得自己亲自动手才行。
|
||
|
||
如何快速上手编写技能?答案是——复制粘贴。直接复制已有的技能代码以为己用,并且推敲那段技能代码的原理,无疑是上手的最快方法。
|
||
|
||
本文将实现这样一个技能:“摸牌阶段,你可以多摸4张牌。”
|
||
|
||
很明显,这个技能就是一个加强版的英姿。将英姿的代码复制过来,稍微改改即可。接下来和大家细说怎么来复制粘贴。
|
||
|
||
--------------
|
||
|
||
首先,fk所有的技能都是Lua编写的,而本着开源精神也没有对Lua代码进行任何特殊处理,因此你可以直接在fk的release版中找到lua代码。英姿是标包的,因此去packages/standard/init.lua,可以找到英姿的代码:
|
||
|
||
.. code:: lua
|
||
|
||
local yingzi = fk.CreateTriggerSkill{
|
||
name = "yingzi",
|
||
anim_type = "drawcard",
|
||
events = {fk.DrawNCards},
|
||
on_use = function(self, event, target, player, data)
|
||
data.n = data.n + 1
|
||
end,
|
||
}
|
||
|
||
好的,复制过来。注意到标包lua里面,英姿在定义武将周瑜的前面,所以我们也把技能粘贴到武将的前面。完事之后,把技能加给武将。至此我们的lua会像这样:
|
||
|
||
.. code:: lua
|
||
|
||
local yingzi = fk.CreateTriggerSkill{
|
||
name = "yingzi",
|
||
anim_type = "drawcard",
|
||
events = {fk.DrawNCards},
|
||
on_use = function(self, event, target, player, data)
|
||
data.n = data.n + 1
|
||
end,
|
||
}
|
||
local study_sunce = General(extension, "study_sunce", "wu", 4)
|
||
study_sunce:addSkill("zhiheng")
|
||
study_sunce:addSkill(yingzi)
|
||
Fk:loadTranslationTable{
|
||
["study_sunce"] = "孙伯符",
|
||
}
|
||
|
||
启动游戏试试看,却给我们甩了个报错:
|
||
|
||
.. image:: ../pic/diy4-pic1.webp
|
||
|
||
原来是这个复制粘贴的技能和已有的英姿重复了。解法很简单,换个名字就行了,这里改名为“激姿”好了。按照命名习惯,为他起一个内部名称”study_jizi”。然后把所有的yingzi都改成这个名,改名后如下:
|
||
|
||
.. code:: lua
|
||
|
||
local study_jizi = fk.CreateTriggerSkill{
|
||
name = "study_jizi",
|
||
anim_type = "drawcard",
|
||
events = {fk.DrawNCards},
|
||
on_use = function(self, event, target, player, data)
|
||
data.n = data.n + 1
|
||
end,
|
||
}
|
||
local study_sunce = General(extension, "study_sunce", "wu", 4)
|
||
study_sunce:addSkill("zhiheng")
|
||
study_sunce:addSkill(study_jizi)
|
||
|
||
重新启动一下游戏,发现正常了,但是只能多摸一张。解法很简单,那句\ ``data.to = data.to + 1``\ 不就是让摸牌数+1吗,那我改成+4就行了,直接把1改成4:
|
||
|
||
.. code:: lua
|
||
|
||
data.n = data.n + 4
|
||
|
||
还有一件事,我们没给技能加翻译,往翻译表加上:
|
||
|
||
.. code:: lua
|
||
|
||
["study_jizi"] = "激姿",
|
||
[":study_jizi"] = "摸牌阶段,你可以多摸4张牌。",
|
||
|
||
至此完事了。别忘了更新一下git,后面不赘述关于git的事情了。
|
||
|
||
--------------
|
||
|
||
稍微解说一下创建技能的语法
|
||
--------------------------
|
||
|
||
我们再来回头看看刚才复制粘贴的代码。
|
||
|
||
首先可以看出,技能是通过\ ``fk.CreateTriggerSkill``\ 创建的。在这个函数名中,Create意为创建,TriggerSkill则是我们要创建的技能类型——触发技。要创建其他技能也一样,都是通过CreateXXXSkill创建的。
|
||
|
||
然后,对于所有技能,我们都要为其指派一个name,用来标记这个技能的名字。这个技能的名字必须是唯一的,不能和其他任何技能产生冲突,最广泛的避免重名的方法就是给技能加上一些前缀。
|
||
|
||
然后有些技能还指派anim_type。这个其实可有可无,它控制的是技能发动时该播放哪种动效,有以下几种取值:
|
||
|
||
- ``special``\ :留空anim_type时候的默认特效。看上去像一条龙的特效,一般用于定位模糊的技能。
|
||
- ``drawcard``\ :看上去像是凤凰展翅的特效,用于主打摸牌的技能。
|
||
- ``control``\ :看上去像草的特效,用于拆牌等控场类技能。
|
||
- ``offensive``\ :看上去像火焰的特效,用于菜刀技能或者直伤等攻击性技能。
|
||
- ``support``\ :看上去像莲花的特效,用于给牌、回血等辅助性技能。
|
||
- ``defensive``\ :看上去像花的特效,用于防御流技能。
|
||
- ``negative``\ :看上去像乌云的特效,用于负面技能。
|
||
- ``masochism``\ :看上去像金色的花的特效,用于卖血类技能。(这个类型取名也是沿用了神杀的恶趣味啊)
|
||
|
||
这些特效的图片素材位于image/anim/skillInvoke中。你可以改变技能的anim_type一一查看,或者直接去看素材也行。但是记住一点,这个属性除了控制技能触发的特效之外,和技能本身并没有任何联系,你想指定啥都行。
|