新元的無名殺擴(kuò)展教程(一)技能13_trigger總結(jié)與補(bǔ)充(下)
函數(shù)
函數(shù)func,實(shí)際上就是一段既成的代碼。在需要使用就引用它,引用的方法是,obj.函數(shù)名(),或,obj[函數(shù)名]()如:
player.draw()
player['draw']()
函數(shù)隨著參數(shù)的不同,會使作用效果有些不同。
我們將引用函數(shù)時,實(shí)際傳入的參數(shù)叫做實(shí)參。
我們在定義的函數(shù)時,寫出的函數(shù)應(yīng)該有的參數(shù)叫做形參。
事件
事件是什么?
事件,指的是可以觸發(fā)技能的函數(shù)。
比如player.damage(),可以觸發(fā)有關(guān)damage的技能,我們就把"damage"稱為一個事件。特別的,技能本身的content函數(shù)也是一個事件。
相對的,另一些函數(shù)無法觸發(fā)技能,就不是事件。
事件也可以指該函數(shù)的有關(guān)參數(shù)(如_status.event當(dāng)前事件的參數(shù),技能中filter函數(shù)的event參數(shù),content的trigger參數(shù)),還可以指函數(shù)執(zhí)行的過程。
事件的執(zhí)行流程
1.分步執(zhí)行
事件可以將一串代碼分割成幾步,按步驟順序執(zhí)行。
"step 0"→"step 1"→"step 2"……
有一些函數(shù)可以調(diào)整步驟執(zhí)行的順序,
比如event.goto,可以調(diào)至指定步數(shù)。
"step 0"(event.goto(5))→"step 5"→"step 6"……
而event.redo,可以重復(fù)該步數(shù)。
"step 0"→"step 1"(event.redo())→"step 1"→"step 1 "……
而event.finish,可以讓事件在當(dāng)前步打住。
"step? 0"(event.finish())
2.事件流程
事件的流程為:
觸發(fā)事件函數(shù)→生成事件并傳遞事件參數(shù)→將相應(yīng)事件添加到事件流上→執(zhí)行相應(yīng)事件
執(zhí)行事件時一般也可分為這幾個階段(也可能有別的階段):
事件Before→事件Begin→事件→事件End→事件After
當(dāng)事件尚未執(zhí)行的時候,我們就可以對事件進(jìn)行修改。
如:
content中寫trigger.cancel()就可以取消這一事件的發(fā)生。
也可以修改其他參數(shù),這樣就會改變事件的實(shí)際效果。
如:
周瑜的〖英姿〗中有這樣一串代碼:
trigger.num++?
這里就修改了事件的參數(shù)。這里的trigger.num決定了摸牌數(shù),因此,改變了它就改變了周瑜的摸牌數(shù)。
除此之外,執(zhí)行事件者(trigger.player),事件來源(trigger.source),事件名稱(trigger.name)都可以修改以造成不同的效果。
3.父子關(guān)系
你有一個技能A:先造成傷害再摸牌。
它發(fā)動這個技能的過程是這樣的:
你對一名造成傷害→你摸牌
不巧這個角色有個技能B:受到傷害后,摸牌
當(dāng)你發(fā)動這個A技能對這個角色造成傷害,而因此這個角色發(fā)動技能B摸牌,然后你再摸牌。
這是這個事件的流程:
你對一名角色造成傷害(該角色發(fā)動技能B(其摸牌))→你摸牌
加粗字體是執(zhí)行技能是引入的事件。
傷害事件其下又分了諸多小事件,在結(jié)算了小事件的過程中,又引入了技能的結(jié)算。這種事件的包含關(guān)系形象地用父子(母子)關(guān)系來表示,就是:
父事件? ?damage
子事件? ?原本damage的子事件? skillB
控制輸入代碼時,也是這種插入結(jié)算,相當(dāng)于為當(dāng)前父(母)事件中添加一個子事件。
當(dāng)然,除了為當(dāng)前事件添加子事件外,還可以對其父(母)事件添加子事件。避免這種結(jié)算方式,結(jié)果如下:
你對一名角色造成傷害→其發(fā)動技能B(摸牌)→你摸牌
4.同步順序
1.原則上,同一步驟的代碼,從上而下執(zhí)行。
2.因?yàn)槭录瘮?shù)的特性,是將事件添加到事件流上,輪到這一事件再處理,所以會發(fā)生一些奇怪的事。
比如:
player.damage(player.hp-1)
player.hp=3;
player.draw(player.hp);
假定開始時,player.hp為2
按照自上而下的順序:
開始時,角色會受到一點(diǎn)傷害,之后會摸三張牌。
實(shí)際效果是,角色先受到兩點(diǎn)傷害,再摸三張牌。
因此,注意事件函數(shù)的延遲特性。
所以推薦寫法是:
"step 0"
player.damage(player.hp-1)
"step 1"
player.hp=3;
player.draw(player.hp);
這樣分步寫,問題即可解決。
事件更改
我們已提到過,content中對trigger的修改,可以改變事件參數(shù)。會影響事件效果。
其實(shí),在事件函數(shù)執(zhí)行時,其返回值便是事件參數(shù),我們也可以對它進(jìn)行修改。
比如:
player.damage().num=10
這樣,角色受到的傷害就為10
我們更建議用事件的set函數(shù)修改,因?yàn)槠浞祷刂狄彩鞘录?shù),可以連續(xù)修改
player.damage().set("num",10).set("player",game.zhu)//主公受到10點(diǎn)傷害
Result,Event
因?yàn)槭录瘮?shù)是延后執(zhí)行的,所以當(dāng)前步驟注定拿不到player.chooseControl,player.chooseTarget的結(jié)果,那怎么辦呢?把結(jié)果傳遞給下一步!
這就是我們用choose函數(shù)必須分步的原因。
對應(yīng)的,
chooseTarget結(jié)果是result.targets(一個players)
chooseControl結(jié)果是result.control
chooseButton結(jié)果是result.links(一個Array)
…
可是當(dāng)我連續(xù)多次用choose函數(shù)那怎么辦呢?result數(shù)據(jù)只有一步的有效期呀!
此時有一個貫穿全部步驟的object,event對象,把數(shù)據(jù)存至其中即可。
后記
trigger技就此講完了,以后會轉(zhuǎn)入對主動技的講解。主要是主動技的一些不同之處,但其實(shí)正真重要的東西,已在trigger技中講解的差不多了。