无名杀技能编写教程

前言:

​ (1)每写一个对象前,请确认是否有这一对象,没有的话请自行定义

​ (2)检测bug用lib.node.debug()

​ (3)具体触发内容看game.js内lib.element.event内的函数

​ (4)本教程只教框架

1.触发:

​ 基本框架:

​ trigger:{//触发时机

​ global:’damageBefore’,//例子,任意一名角色受到伤害前

​ player:’damageBefore’,//例子,玩家受到伤害前

​ player:[‘damageBefore’, ‘recoverAfter’], //例子,玩家受到伤害前或玩家恢复体力后

​ },

​ priority: 1,//同时机技能发动的优先度

​ check:function(event,player){//告诉ai是否发动这个技能,返回true则发动此技能

​ //无例子,因为不同时机evevt参数内的元素不同

​ //要了解evevt参数内的元素,具体看game.js内lib.element.event内的函数

​ },

​ frequent:true,//此技能是否可以被设置为自动发动(不询问)

​ forced:true,//此技能是否能固定触发,true为固定触发(锁定技)

​ nopop:true,//player是否logSkill(‘此技能’),true为不

​ direct:true,//相当于上面两行相加

​ filter:function(event,player){//触发条件,返回true则发动此技能

​ //无例子,因为不同时机evevt参数内的元素不同

​ //要了解evevt参数内的元素,具体看game.js内lib.element.event内的函数

​ },

​ content:function(){//触发内容,分步执行会在后面讲到

​ //参数trigger相当于filter:function(event,player){}内的event

​ player.recover()//例子,玩家回复一点体力

​ },

2.主动:

​ 基本框架:

​ enable:”phaseUse”,//出牌阶段使用

​ usable:1,//每回合限制使用次数

​ //限制使用次数为变量时需写在filter:function(event,player){}内

​ filter:function(event,player){ //发动条件,返回true则可以发动此技能

​ /*限制使用次数为变量时:

​ if(player.getStat().skill[‘技能名’]>=变量) return false;(变量可以写player.hp等)

​ return true;

​ */

​ return player.hp<2;//例子,玩家体力小于2时可以发动

​ },

​ filterCard:function(card){//选择的牌需要满足的条件

​ return get.color(card)==’red’;//例子,只能选择红色牌

​ },

​ position:’hej’,//可以选择什么位置的牌

​ //写入其中的字符:’h’:手牌区, ‘e’:装备区, ‘j’:判定区

​ selectCard:2,//需要选择多少张牌才能发动

​ //为-1时,选择所有牌

​ //为数组时,这个数组就是选择牌数的区间

​ /*为变量时(具体情况具体分析):

​ function(card){//例子,变量为玩家体力时

​ var pl=get.owner(card);//pl定义为选择牌中的牌的拥有者,即“你”

​ return [pl.hp,Infinity];//返回可选手牌数为你的体力值到无限

​ },

​ */

​ check:function(card){//ai应该如何选牌,返回值为正则此牌可选,反之,此牌不可选

​ /*在check中定义玩家(你):

​ var player=get.owner(card);

​ */

​ return 6-get.value(card);//例子,ai可选价值大于6的卡牌

​ },

​ discard:false,//是否弃牌,若没有这一行,选择牌发动技能后,被选择的牌都要弃置

​ prepare:’give’,//不弃牌,准备用这些牌来干什么

​ filterTarget:function(card,player,target){//选择的目标需要满足的条件

​ return target!=player;//例子,目标不是玩家

​ },

​ selectTarget:1, //需要选择多少个目标才能发动

​ //为-1时,选择全部人

​ //为数组时,这个数组就是选择目标数的区间

​ multitarget:true,//是否每个目标都结算一次,true为否

​ targetprompt:[],//选择的目标武将牌上出现什么字,数组第几元素对应第几个目标

​ content:function (){//触发内容,分步执行会在后面讲到

​ //当有filterCard时,有参数cards

​ //当有filterTarget时,有参数target和targets

​ player.recover()//例子,玩家回复一点体力

​ },

3.视为:

(1)转化为一张卡牌:

​ 基本框架:

​ name:’技能’,//技能按钮名字,不写则默认为此技能的翻译

​ enable:[‘phaseUse’,’chooseToRespond’],//发动视为技的时机,现在为出牌阶段和响应时

​ viewAsFilter:function(player){//视为技按钮出现条件(即发动条件)

​ return player.maxHp==4;//例子,玩家最大体力值为4时可以发动

​ },

​ filterCard:{type:’basic’},//选择的牌需要满足什么条件

​ /*上面那种是简便写法,多次判断的话还是要写回旧格式:

​ filterCard:function(card){

​ return get.color(card)==’black’;//例子,只能选择黑色牌

​ },

​ */

​ position:’hej’,//可以选择什么位置的牌,和主动的position相同,不解释

​ selectCard:2, //需要选择多少张牌才能发动,和主动的selectCard相同,不解释

​ check:function(card){// ai应该如何选牌,和主动的check相同,不解释

​ return 1;//例子,ai可以所有所有手牌

​ },

​ viewAs:{name:’tao’},//目标卡牌

​ prompt:’将一张基本牌当桃使用或打出’,//选择时弹出的提示

​ onuse:function(result,player){//使用视为牌时触发内容,result.cards是视为前的牌

​ player.recover();//例子,使用视为牌时玩家回复一点体力

​ },

(2)转化为多张卡牌:

​ 基本框架:

​ enable:’phaseUse’, //发动视为技的时机,现在为出牌阶段

​ usable:1, //每回合限制使用次数,和主动的usable相同,不解释

​ filter:function(event,player){ //发动条件,和主动的filter相同,不解释

​ return player.countCards(‘h’)>0//例子,玩家手牌数大于0时可以发动

​ },

​ chooseButton:{//选择按钮(牌)

​ dialog:function(){//选择内容,一般为选择卡牌,有能力的可以写成选择其他东西

​ return ui.create.dialog([[‘sha’,’shan’],’vcard’]);//可以选择杀和闪(卡牌)

​ },

​ filter:function(button,player){//卡牌选择条件

​ return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent());

​ //例子,你可以选择你可以使用的卡牌

​ },

​ check:function(button){//ai如何选牌

​ /*定义player:

​ var player=_status.event.player;

​ */

​ if(button.link==’sha’) return 1;//ai选择杀

​ },

​ backup:function(links,player){//返回视为(1)部分

​ return {//例子

​ filterCard:false,//不用弃牌

selectCard:0, //弃牌数为零

​ viewAs:{name:links[0][2]},//视为你使用你选择的牌

​ };

​ },

​ prompt:function(links,player){ //选择时弹出的提示

​ return ‘请选择’+get.translation(links[0][2])+’的目标’;

​ //例子,弹出提示:选择你选择的牌的目标

​ },

​ },

4.AI:

(注:可接视为框架、主动框架或触发框架)

(注2:这部分我不是很熟悉,所以只能简单地说一下)

​ 基本框架:

​ ai:{

​ save:true, //此技能可以用于自救

​ respondTao:true, //此技能可以用于救人,一般用于视为技

​ respondShan:true,//此技能可以响应杀,一般用于视为技

​ respondSha:true, //此技能可以响应闪,一般用于视为技

​ order:8, //ai发动技能的优先度

​ /*比什么先:

​ order:function(){//例子,比打出杀的优先度高1

​ return get.order({name:’sha’})+1;

​ },

​ */

​ expose:0.2, //发动技能是身份暴露度(0~1,相当于概率)

​ maixie:true, //卖血技

​ threaten:0.5,//嘲讽值

​ result:{//主动技专属

​ target:function(player,target){//ai如何选择目标

​ //返回负,选敌人,返回正,选队友

​ //没有返回值则不选

​ //写了这个就不用写player:function(player){}了

​ //因为player可以在这里进行判断

​ If(player.hp>2) return -1;//例子,玩家体力大于2时,发动技能并选择敌人

​ },

​ player:function(player){//ai是否发动此技能,返回正,发动,否则不发动

​ if(player. countCards(‘h’)<2) return 1;//例子,玩家手牌数小于2时,发动 },

​ },

​ effect:{//影响ai出牌(例如什么时候不出杀)等

​ //没有深入研究,不讲

​ },

​ skillTagFilter:function(player){//视为技专属,ai什么时候可以发动视为技

​ player.countCards(‘h’,{type:’basic’})>0;//例子,手牌中有基本牌时,ai发动技能

​ },

​ },

5.标记:

(注:可接视为框架、主动框架或触发框架)

​ 基本框架:

​ marktext:”状”,//标记显示文本,一般为一个字

​ locked:true,//是否实时更新

​ intro:{

​ content:’cards’,// 标记显示内容,为cards时显示标记内的牌

​ /*标记显示内容为文本写法:

​ content:function (storage,player,skill){//返回值(文本)即为标记显示内容

​ return ‘当前有’+storage+’个标记’//标记显示内容为当前有多少个标记

​ },*/

​ },

​ mark:true,//获得技能时是否显示此标记,若为false,可以用markSkill()来显示此标记

6.获得技能和失去技能时:

(注:可接视为框架、主动框架或触发框架)

​ 基本框架:

​ init:function (player){//获得技能时发动

​ player.gainMaxHp();//例子,获得此技能时,玩家增加一点最大体力

​ },

​ onremove:function(player){//失去技能时发动

​ player.loseMaxHp();//例子,失去此技能时,玩家失去一点最大体力

​ },

7.技能组与子技能:

(注:可接视为框架、主动框架或触发框架)

​ 基本框架:

​ group:[“mashu”],//技能组,拥有这个技能时相当于拥有技能组内的技能

​ subSkill:{//子技能,你不会拥有写在这里面的技能,可以调用,可以用技能组联系起来

​ “子技能”:{//子技能名字:“主技能_子技能”,翻译为主技能翻译

​ //技能内容

​ },

​ },

8.mod类锁定技:

(注:可接视为框架、主动框架或触发框架)

​ 基本框架:

​ mod:{

​ globalFrom:function(from,to,distance){

​ return distance-1; //例子,进攻距离+1

​ },//from:玩家;to:目标;distance:进攻距离

​ globalTo:function(from,to,distance){

​ return distance+1; //例子,防御距离+1

​ },// to:玩家;from:目标;distance:防御距离

​ maxHandcard:function (player,num){

​ return num+1; //例子,手牌上限+1

​ },// player:玩家;num:手牌上限

​ targetEnabled:function(card,player,target){

​ if(player.sex==’male’) return false; //例子,你不能成为男性角色的牌的目标

​ },// card:牌;player:使用牌的角色;target:玩家

​ selectTarget:function (card,player,range){

​ if(card.name==’sha’) range[1]+=1; //例子,你的杀可以额外选择一名角色

​ },// card:牌;player:玩家;range[1]:目标个数; range:不清楚

​ targetInRange:function(card,player, target){

​ if(card.name==’sha’) return true;//例子,你使用的杀可以指定所有角色

​ },// card:牌;player:玩家;target:目标

​ cardDiscardable:function(card,player){

​ if(card.name==’sha’) return false; //例子,你无法弃置杀

​ },// card:牌;player:玩家

​ cardEnabled:function(card,player){//要与cardUsable一起使用

​ if(get.suit(card)==’heart’) return false;//例子:你无法使用红桃牌

​ },// card:牌;player:玩家

​ cardUsable:function(card,player){ //要与cardEnabled一起使用

​ if(get.suit(card)==’heart’) return false; //例子:你无法使用红桃牌

​ },// card:牌;player:玩家

​ cardRespondable:function(card,player){

​ if(get.suit(card)==’heart’) return false; //例子:你无法使用红桃牌来响应

​ },// card:牌;player:玩家

​ cardSavable:function(card,player){

​ if(get.suit(card)==’heart’) return false; //例子:你无法使用红桃牌来救人

​ },// card:牌;player:玩家

​ /*后4种卡牌禁言类mod技与视为技冲突的解决方法:

​ 判定内加入_status.event.skill!=’冲突视为技’

​ 意思为你无法使用牌,除非使用这个视为技视为无法使用的牌

​ */

​ },

9.配音的添加:

(注:可接视为框架、主动框架或触发框架)

​ 基本框架:

​ //数字为配音数量,从1开始

​ //配音命名方法:技能名+这是第几个配音

​ audio:2,//使用无名杀目录\audio\skill内的配音

​ audio:”ext:扩展名:1”,//使用无名杀录目\extension \扩展名内的配音

10.主公技:

(注:可接视为框架、主动框架或触发框架)

​ 基本框架:

​ zhuSkill:true,//将这个技能设置为主公技

11.全局技能:

(注:可接视为框架、主动框架或触发框架)

(注:无论是否拥有此技能,此技能都为全局技能写法:技能名前+_)

​ 基本框架:

​ global:’技能’,你用有此技能时,所有角色拥有技能(global的值)

12.触发内容分步:

(注:写在触发内容中)

​ 基本框架:

​ ‘step 0’

​ //此步骤触发的内容

​ ‘step 1’

​ //此步骤触发的内容

与步骤有关的函数:

(1)evevt.finish() 触发后步骤不再往下走,终止于evevt.finish()所在步骤

(2)event.goto(num) num为步骤数,返回第几步

(3)event.redo() 重新执行这个步骤

注意:

(1)引号要相同,不要’step 0’ “step 1”

(2)使用与步骤有关的函数,这个步骤依旧会进行到底

(3)var定义的东西不能在步骤中传递,可以储存到evevt中

(4)函数的result元素可以在相邻的步骤中传递

(5)步骤必须从0开始

(6)step和数字之间有一个空格,word文档中不易看出来

例子:

​ “step 0”//步骤0

​ player.chooseTarget(‘请选择一名角色’,function(card,player,target){

​ return player!=target;

​ }).ai=function(target){

​ return get.attitude(player,target);//告诉ai选择队友

​ };//选择一名其他角色

​ “step 1”//步骤1

​ if(result.bool){//如果有选择角色

​ event.target=result.targets[0]; //将选择的角色储存到event.target中

​ player.chooseCard(‘请选择给予牌’,2,’h’).set(‘ai’,function(card){

​ return 1;//告诉ai可以选择所有手牌

​ });//选择两张手牌

​ }else{//否则

​ event.finish();//步骤将于这里终止

​ };

​ “step 2”//步骤2

​ if(result.bool){ //如果有选择手牌

​ player.$give(result.cards.length,event.target);

​ event.target.gain(result.cards,player);//被选择的角色获得这两张牌

​ };



本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!