FreeKill/docs/diy/04-newskill.rst

106 lines
4.8 KiB
ReStructuredText
Raw Normal View History

.. 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一一查看或者直接去看素材也行。但是记住一点这个属性除了控制技能触发的特效之外和技能本身并没有任何联系你想指定啥都行。