欢迎光临散文网 会员登陆 & 注册

新元的无名杀扩展教程(一)技能13_trigger总结与补充(下)

2023-03-19 15:45 作者:新元noname  | 我要投稿

函数

函数func,实际上就是一段既成的代码。在需要使用就引用它,引用的方法是,obj.函数名(),或,obj[函数名]()如:

player.draw()

player['draw']()

函数随着参数的不同,会使作用效果有些不同。

我们将引用函数时,实际传入的参数叫做实参。

我们在定义的函数时,写出的函数应该有的参数叫做形参。


事件

事件是什么?

事件,指的是可以触发技能的函数。

比如player.damage(),可以触发有关damage的技能,我们就把"damage"称为一个事件。特别的,技能本身的content函数也是一个事件。

相对的,另一些函数无法触发技能,就不是事件。

事件也可以指该函数的有关参数(如_status.event当前事件的参数,技能中filter函数的event参数,content的trigger参数),还可以指函数执行的过程。

事件的执行流程

1.分步执行

事件可以将一串代码分割成几步,按步骤顺序执行。

"step 0"→"step 1"→"step 2"……

有一些函数可以调整步骤执行的顺序,

比如event.goto,可以调至指定步数。

"step 0"(event.goto(5))→"step 5"→"step 6"……

event.redo,可以重复该步数。

"step 0"→"step 1"(event.redo())→"step 1"→"step 1 "……

event.finish,可以让事件在当前步打住。

"step  0"(event.finish())

2.事件流程

事件的流程为:

触发事件函数→生成事件并传递事件参数→将相应事件添加到事件流上→执行相应事件

执行事件时一般也可分为这几个阶段(也可能有别的阶段):

事件Before→事件Begin→事件→事件End→事件After

当事件尚未执行的时候,我们就可以对事件进行修改。

如:

content中写trigger.cancel()就可以取消这一事件的发生。

也可以修改其他参数,这样就会改变事件的实际效果。

如:

周瑜的〖英姿〗中有这样一串代码:

trigger.num++ 

这里就修改了事件的参数。这里的trigger.num决定了摸牌数,因此,改变了它就改变了周瑜的摸牌数。

除此之外,执行事件者(trigger.player),事件来源(trigger.source),事件名称(trigger.name)都可以修改以造成不同的效果。

3.父子关系

你有一个技能A:先造成伤害再摸牌。

它发动这个技能的过程是这样的:

你对一名造成伤害→你摸牌

不巧这个角色有个技能B:受到伤害后,摸牌

当你发动这个A技能对这个角色造成伤害,而因此这个角色发动技能B摸牌,然后你再摸牌。

这是这个事件的流程:

你对一名角色造成伤害(该角色发动技能B(其摸牌))→你摸牌

加粗字体是执行技能是引入的事件。

伤害事件其下又分了诸多小事件,在结算了小事件的过程中,又引入了技能的结算。这种事件的包含关系形象地用父子(母子)关系来表示,就是:

父事件   damage

子事件   原本damage的子事件  skillB

控制输入代码时,也是这种插入结算,相当于为当前父(母)事件中添加一个子事件。

当然,除了为当前事件添加子事件外,还可以对其父(母)事件添加子事件。避免这种结算方式,结果如下:

你对一名角色造成伤害→其发动技能B(摸牌)→你摸牌

4.同步顺序

1.原则上,同一步骤的代码,从上而下执行。

2.因为事件函数的特性,是将事件添加到事件流上,轮到这一事件再处理,所以会发生一些奇怪的事。

比如:

player.damage(player.hp-1)

player.hp=3;

player.draw(player.hp);

假定开始时,player.hp为2

按照自上而下的顺序:

开始时,角色会受到一点伤害,之后会摸三张牌。

实际效果是,角色先受到两点伤害,再摸三张牌。

因此,注意事件函数的延迟特性。

所以推荐写法是:

"step 0"

player.damage(player.hp-1)

"step 1"

player.hp=3;

player.draw(player.hp);

这样分步写,问题即可解决。

事件更改

我们已提到过,content中对trigger的修改,可以改变事件参数。会影响事件效果。

其实,在事件函数执行时,其返回值便是事件参数,我们也可以对它进行修改。

比如:

player.damage().num=10

这样,角色受到的伤害就为10

我们更建议用事件的set函数修改,因为其返回值也是事件参数,可以连续修改

player.damage().set("num",10).set("player",game.zhu)//主公受到10点伤害


Result,Event

因为事件函数是延后执行的,所以当前步骤注定拿不到player.chooseControl,player.chooseTarget的结果,那怎么办呢?把结果传递给下一步!

这就是我们用choose函数必须分步的原因。

对应的,

chooseTarget结果是result.targets(一个players)

chooseControl结果是result.control

chooseButton结果是result.links(一个Array)

可是当我连续多次用choose函数那怎么办呢?result数据只有一步的有效期呀!

此时有一个贯穿全部步骤的object,event对象,把数据存至其中即可。


后记

trigger技就此讲完了,以后会转入对主动技的讲解。主要是主动技的一些不同之处,但其实正真重要的东西,已在trigger技中讲解的差不多了。

新元的无名杀扩展教程(一)技能13_trigger总结与补充(下)的评论 (共 条)

分享到微博请遵守国家法律