熊猫rrr

V1

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属性是触发技的关键属性,它指明了应该在什么时候触发技能。它是一个对象,可包含playertargetglobal三个对象。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调用的函数,当技能被触发时,如果frequentforced都不为true,ai就会通过这个check函数的返回值来决定是否发动技能:返回true则发动,false则不发动。


我们上面写的【骁勇】技能是一个最简单的触发技,本篇文章主要通过这个技能来介绍触发技的基本结构和主要的触发时机。下一篇文章我们还将编写一个更复杂的触发技,在filtercontentcheck中添加更多的代码,实现弃牌、摸牌、回血、手牌判断等效果。


如果你发现文章中有错误的地方,或者有疑问,或者有任何想要交流的想法,可以给我留言哦。

公众号图片
公众号图片

分类:

前端

标签:

JavaScript

作者介绍

熊猫rrr
V1