新元的无名杀扩展教程(一)技能13_trigger总结与补充(下)
函数
函数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技中讲解的差不多了。