熊猫rrr
2023/05/25阅读:29主题:默认主题
无名杀扩展学习-4:创建触发技(1)
上一篇文章中我们学习了视为技的编写,今天我们来学习另一种类型的技能:触发技。
所谓触发技,就是在特定的事件发生时会发动的技能。比如准备阶段开始时、判定时、受到伤害时、使用或打出某张牌时等等。我们所熟悉的【奸雄】、【英姿】、【鬼才】、【铁骑】等都属于触发技。触发技可以很简单,也可以很复杂。我们将分两篇来学习触发技的编写,下面先让我们从一个简单的触发技开始,学习触发技的基本结构。
代码编写
假设我们要编写一个名为“骁勇”的技能,描述如下:
骁勇:你使用或打出一张【杀】后可以摸一张牌。
还是打开extension.js
,在桃园兄弟的代码上方输入以下代码:
extension_skills.xiaoyong = {
trigger: {
player: ['useCard', 'respond']
},
frequent: true,
forced: false,
filter: function (event) {
return get.name(event.card) == 'sha' && event.card.isCard;
},
content: function () {
player.draw();
},
check: function(event, player){
return true;
}
}
extension_skill_translate.xiaoyong = "骁勇";
extension_skill_translate.xiaoyong_info = "你使用或打出一张【杀】后可以摸一张牌";
然后将桃园兄弟的技能修改为骁勇:
extension_characters.taoyuanxiongdi = ["male", "shu", 10, ["xiaoyong"], ["des:乱世英雄"]];
这样就完成了骁勇技能的编写了,可以先进游戏体验一下哦!
代码详解
以上代码虽简单,但已经展示了触发技的整体结构。一个触发技应包含以下属性:
属性 | 类型 | 含义 | 可选值 |
---|---|---|---|
trigger | 对象 | 触发时机 | |
frequent | 布尔值 | 是否自动发动 | true, false |
forced | 布尔值 | 是否锁定技 | true, false |
filter | 函数 | 判定技能什么情况下可以发动 | |
content | 函数 | 技能主体 | |
check | 函数 | ai判断是否发动技能 |
trigger
属性是触发技的关键属性,它指明了应该在什么时候触发技能。它是一个对象,可包含player
、target
和global
三个对象。player
属性表示监听该技能的拥有者,只有在该技能的拥有者触发特定事件时才发动技能;target
属性表示当拥有该技能的角色被当作目标人物时才会触发特定事件,通常只与useCardToTargeted
等特定时机搭配使用;global
属性表示监听所有的角色,任何一个角色触发特定事件时都会发动技能。在我们的示例代码中,trigger
属性是这样写的:
trigger: {
player: ['useCard', 'respond']
}
可以看到,player
属性是一个字符串数组,其中的'useCard'
、'respond'
分别表示使用牌和响应其他牌这两个时机。这个trigger
对象就表示在拥有该技能的角色使用牌或者响应其他角色的牌时,就会触发该技能。如果你的技能只有一个触发时机,也可以不用数组,直接写一个字符串就行了。你可以尝试将player
改为global
,再进入游戏,你会发现只要有角色使用或打出杀,你都可以摸一张牌了,强度逆天了有没有!
触发时机的可选值有很多,这边初步整理了一下,主要有以下这些:
名称 | 流程 | 示例技能 |
---|---|---|
enterGame | 游戏开始时 | 七星 |
phaseZhunbeiBegin | 准备阶段开始时 | 魂姿 |
phaseJudgeBefore | 判定阶段开始前 | 巧变 |
judge | 判定生效前 | 鬼才 |
judgeEnd | 判定生效后 | 天妒 |
phaseDrawBefore | 摸牌阶段开始前,可在此时跳过摸牌阶段 | 巧变 |
phaseDrawBegin1 | 摸牌开始前 | 双雄 |
phaseDrawBegin2 | 摸牌时 | 英姿 |
phaseUseBegin | 出牌阶段开始时 | 巧说 |
useCard1 | 使用牌的第一个触发点,更改牌的属性、使用次数、可用对象等在此时机发动 | 咆哮、帷幕 |
useCard2 | 使用牌的第二个触发点,此时牌的属性已确定,但还未正式用出,可在此时增加或减少牌的对象 | 奔袭 |
useCard | 将牌使用出去时,此时牌已用出并指定了对象,但还未最后确定对象 | 集智 |
useCardToPlayer | 对指定对象的对象使用牌时,此时牌的对象已指定,但还未最后确定,可在此时改变牌的对象 | 谏征 |
useCardToTarget | 成为牌的使用对象时,此时牌的对象已指定,但还未最后确定,可在此时改变牌的对象 | 同疾、流离 |
useCardToPlayered | 对指定对象使用牌后,此时牌的对象已确定,但还未结算,可在此时改变牌的响应规则 | 铁骑 |
useCardToTargeted | 成为牌的使用对象后,此时牌的对象已确定,但还未结算,可在此时改变牌的响应规则 | 享乐 |
useCardToBefore | 牌生效前,此时可以阻止牌的生效 | 无言 |
useCardToBegin | 牌生效时 | 谦逊(界) |
useCardAfter | 出牌结算后 | 巨象 |
shaMiss | 杀被闪抵消时 | 猛进 |
chooseToRespondBefore | 选择响应牌前 | 护驾 |
respond | 响应牌后 | 雷击 |
compare | 拼点时 | 天辩 |
chooseToCompareBegin | 拼点开始时 | 酣战 |
chooseToCompareAfter | 拼点结束后 | 纵适 |
damageBegin1 | 伤害结算的第一个触发点 | 裸衣 |
damageBegin2 | 伤害结算的第二个触发点 | 制蛮 |
damageBegin3 | 伤害结算的第三个触发点 | 耀武 |
damageBegin4 | 伤害结算的第四个触发点 | 天香 |
damageEnd | 伤害结束时 | 刚烈 |
damageAfter | 伤害结束后 | 矢北 |
changeHp | 体力值改变时 | 不屈 |
dying | 进入濒死状态时 | 补益 |
die | 死亡时 | 断肠 |
loseAfter | 失去牌时 | 连营 |
equipAfter | 装备牌时 | 枭姬 |
phaseUseEnd | 出牌阶段结束时 | 精策 |
phaseDiscardBefore | 弃牌阶段开始前 | 克己 |
phaseDiscardAfter | 弃牌阶段结束后 | 固政 |
phaseJieshuBegin | 结束阶段开始时 | 闭月 |
以上列举的触发时机并没有涵盖所有。实际上,每一个行为都会有Before、Begin、End、After这四个时机,分别代表这个行为的开始前、开始时、结束时、结束后,只是有些触发时机并没有哪个技能用到,这里就不放进去了。
frequent
属性指明这个触发技是不是自动发动的。有些触发技是可以无脑发动的,比如英姿、闭月等,这时候就可以将frequent
属性设置为true
,那么技能在它的触发时机就会自动发动,不需要询问玩家,ai操作的时候也不需要编写额外的代码。跟锁定技不同的是,这个自动发动的属性是可以在游戏中关掉的。frequent
属性的默认值是false
。
forced
属性指明这个技能是不是锁定技。当该属性为true
时即表示它是锁定技。默认为false
。
filter
属性是在达到触发时机时,判断技能可否被触发的函数。一个技能被触发需同时满足两个条件:一是达到触发时机,二是filter
函数返回true
。该函数接收一个event
对象作为参数。关于event
对象我们将在后面的章节中详细介绍。在上面的示例代码中,filter
属性是这样的:
filter: function (event) {
return get.name(event.card) == 'sha' && event.card.isCard;
},
这里首先用event.card
获取了当前所使用的牌,然后用get.name
这个函数获取了牌的名称(还记得上一篇文章中讲到的get
对象吗?),然后判断这个名称是否为sha
,并且这个杀是不是一张实体牌(用event.card.isCard
判断)。当这个判断返回true
时,即表示这个技能达成了触发条件,将被触发。反之则不会触发,比如你用了【杀】以外的牌,那就不会有什么反应了。
content
属性是触发技的核心,它定义了技能在触发之后要做哪些事情。无论是摸牌、扣血、翻面还是其他五花八门的行为,都是在这里定义的。这里是你发挥创意的主要舞台。要想自由地将你脑海中的奇思妙想变为代码,需要熟悉游戏里定义的各种方法,这些方法我们将在后面的文章中再详细介绍。今天我们先来看一个最简单的方法:摸牌。在示例代码中,我们定义的content
是这样的:
content: function () {
player.draw();
},
通过player.draw()
这个函数即可让角色摸一张牌,这个函数还可以接收一个数字作为参数,让角色摸指定数量的牌。比如player.draw(3)
就会让角色摸3张牌。
check
属性是供ai调用的函数,当技能被触发时,如果frequent
和forced
都不为true
,ai就会通过这个check
函数的返回值来决定是否发动技能:返回true
则发动,false
则不发动。
我们上面写的【骁勇】技能是一个最简单的触发技,本篇文章主要通过这个技能来介绍触发技的基本结构和主要的触发时机。下一篇文章我们还将编写一个更复杂的触发技,在filter
、content
、check
中添加更多的代码,实现弃牌、摸牌、回血、手牌判断等效果。
如果你发现文章中有错误的地方,或者有疑问,或者有任何想要交流的想法,可以给我留言哦。

作者介绍