企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
技能并不是凭空产生的,是需要我们主动创建的。作为我们的武将扩展行为,创建我们自己的技能占据了很重要的地位。 </br>然而,不同的技能有不同的创建方法。之前我们已经成功创建了一个关于距离修改的技能,但是显然同样的方法面对那些与距离无关的技能的创建工作就无能为力了。 </br>太阳神三国杀的技能体系很庞大,有各式各样的技能。但是大体上看,这些技能可以依照它们的特点划分成一些相对好理解的类别: 1. 视为技(以及锁定视为技等) 2. 触发技(以及卖血触发技、启动触发技、阶段触发技等) 3. 禁止技 4. 距离修改技 5. 手牌上限技 </br>☆ 视为技,就是指那种允许把一张或者几张卡牌当作其它卡牌使用或打出的技能。比如倾国(把一张黑牌当作闪)、乱击(把两张同花色的牌当作万箭齐发)之类的。 </br>在视为技中,被视作为的卡牌不一定是实际存在的卡牌。比如鬼才,是把一张手牌当作一张虚拟的卡牌打出,而虚拟的卡牌具有更改判定的作用效果。这样的被视作为的、可以完成一定技能效果的虚拟卡牌,称作技能卡。 </br>视为技有一门远房亲戚,被大家称为锁定视为技。指将一张卡牌永久视为其它卡牌的技能。目前已有的锁定视为技有:红颜、武神、禁酒等。 </br>创建一个视为技用到的方法为`sgs.CreateViewAsSkill`,它的原型是: ``` sgs.CreateViewAsSkill{ name, n, view_filter, view_as, enabled_at_play, enabled_at_response, enabled_at_nullification } ``` </br>其中: 1. `name`表示技能的名字; 2. `n`表示发动技能所使用的最大卡牌数目; 3. `view_filter`表示发动技能所使用的卡牌的约束条件,可以通过函数进行传值。函数的原型为:`function(self, selected, to_selected)`; 4. `view_as`表示那个被视为的卡牌,也可以通过函数进行传值。函数原型为:`function(self, cards)`; 5. `enabled_at_play`表示约定是否允许主动使用视为的卡牌,这个传值函数的原型是:`function(self, player)`; 6. `enabled_at_response`表示约定是否允许使用视为的卡牌进行响应。不过,它的传值函数原型却是`function(self, player,pattern)`。 7. `enabled_at_nullification`表示约定是否允许在询问无懈可击的时候发动这个技能。传值函数原型是`function(self, player)`。 ![](https://img.kancloud.cn/62/df/62df1d931773b04bf87b7e7f0f94069c_590x440.png) </br>值得一提的是,锁定视为技的创建方法,是`sgs.CreateFilterSkill`,原型是: ``` sgs.CreateFilterSkill{name, view_filter, view_as} ``` </br>这些参数和创建视为技的CreateViewAsSkill的同名参数的含义是一样的啦。 </br>☆ 触发技,就是指那种一旦遇到某个条件,就可以发动产生某种效果的技能。比如放逐(受到伤害时可让某角色摸牌翻面)、闭月(回合结束阶段时可摸一张牌)之类的。 </br>触发技中有一部分技能是在受到伤害时发动的,就是著名的卖血触发技了;也有一些是遇到回合中的某个阶段被触发的,被称作阶段触发技。 </br>PS:我们之前设计的美王技能也是一个触发技哦~ </br>创建一个触发技用到的方法是`sgs.CreateTriggerSkill`,它的原型是: ``` sgs.CreateTriggerSkill{ name, frequency, events, view_as_skill, on_trigger, can_trigger, priority } ``` </br>其中: 1. `name`还是表示技能的名字 2. `frequency`表示技能发动的频率类型,有以下几种取值: 不频繁发动:sgs.Skill_NotFrequent(界面上是凸起的按钮) 频繁发动:sgs.Skill_Frequent(界面上是按下的按钮) 锁定技:sgs.Skill_Compulsory(界面上是锁定技按钮) 限定技:sgs.Skill_Limited(界面上是限定技按钮) 觉醒技:sgs.Skill_Wake(界面上是觉醒技按钮) 它的默认值是sgs.Skill_NotFrequent(不频繁发动)。 3.`Events`表示技能触发的时机列表,用一个大括号将各种时机括起来成为一个整体作为它的取值。可用的触发时机有: | 内部名 | 翻译 | 内部名 | 翻译 | | --- | --- | --- | --- | | NonTrigger | 空时机 | Damage | 造成伤害后,用于烈刃等 | | GameStart | 游戏开始时 | Damaged | 受到伤害后,用于遗计等 | | TurnStart | 回合开始前 | DamageComplete | 伤害结算完毕,触发铁锁链环等 | | EventPhaseStart | 阶段开始时 | Dying | 进入濒死状态时 | | EventPhaseEnd | 阶段结束时 | AskForPeaches | 处于濒死状态时 | | EventPhaseChanging | 两阶段之间的时间点 | AskForPeachesDone | 濒死结算完毕 | | DrawNCards | 摸牌阶段摸牌时 | Death | 死亡时 | | HpRecover | 恢复体力时 | GameOverJudge | 游戏胜负判定 | | HpLost | 流失体力时 | GameFinished | 游戏结束时 | | HpChanged | 体力变化时 | SlashEffect | 杀生效前 | | MaxHpChanged | 体力上限变化时 | SlashEffected | 杀生效后 | | EventLoseSkill | 失去技能时 | SlashProceed | 杀结算时 | | EventAcquireSkill | 获得技能时 | SlashHit | 杀命中时 | | StartJudge | 判定开始时 | SlashMissed | 杀被闪避时 | | AskForRetrial | 判定牌生效前 | CardAsked | 被要求使用卡牌时 | | FinishRetrial | 判定牌生效时 | CardResponsed | 打出卡牌时 | | FinishJudge | 判定结束时 | CardDiscarded | 弃牌时 | | Pindian | 翻开拼点牌时 | CardsMoveOneTime | 卡牌移动时 | | TurnedOver | 翻面后 | CardDrawing | 摸牌时 | | ConfirmDamage | 确定伤害时 | CardDrawnDone | 摸牌后 | | Predamage | 造成伤害前,绝情技能专用 | CardUsed | 卡牌选择目标后 | | DamageForseen | 伤害结算开始时,用于狂风和大雾 | TargetConfirming | 指定/成为目标时 | | DamageCaused | 造成伤害时,用于潜袭等 | TargetConfirmed | 指定/成为目标后 | | DamageInflicted | 受到伤害时,用于天香等 | CardEffect | 卡牌生效前 | | PreHpReduced | 扣减体力前 | CardEffected | 卡牌生效后 | | DamageDone | 扣减体力 | PostCardEffected | 卡牌结算完毕后置入弃牌堆时,巨象专用 | | PostHpReduced | 扣减体力后 | CardFinished | 卡牌结算完毕后 | 这些触发时机可以从源码(可在群文件里搜索 秒沉水 查找到源码)的src\core\structs.h中找到。 4. view_as_skill表示技能触发时视为发动的技能,是一个视为技。例如突袭技能在摸牌阶段触发时,会视为发动了一个视为技,视为使用了一张可以获得两名角色各一张手牌的技能卡。 5. on_trigger表示触发技能时做的事情,或者说触发效果。它其实是一个函数,函数原型为:function(self, event, player, data) 6. can_trigger表示除触发时机以外的技能触发条件,默认值为“具有本技能并存活”。其实它也是一个函数,原型为:function(self, target) 7. priority表示技能发动的优先级。数值越高,则在同一时机有多个触发技时就越先发动,默认值是1。游戏规则的优先级是0,卖血触发技的优先级一般是-1,而锁定技和觉醒技的优先级是2。 ![](https://img.kancloud.cn/c4/2e/c42e4a7be303a0de0b79c000323626b5_646x313.png) </br>唔……好像一口气看了太多了……有点心虚…… </br>不过其实我们现在已经把最主要的两类技能了解得差不多了。剩下的那三类占的比重已经不是很大了,都是一些特殊技能而已。 </br>☆ 禁止技,就是具有禁止使用效果的技能啦。具体到游戏里面,就是那些不能成为目标的技能了。比如空城(没手牌时不能成为杀和决斗的目标)、谦逊(不能成为顺手牵羊和乐不思蜀的目标)之类的。 </br>创建一个禁止技用到的方法是`sgs.CreateProhibitSkill`,它的原型是: ``` sgs.CreateProhibitSkill{name, is_prohibited} ``` </br>其中: 1. name依然是技能的名字…… 2. is_prohibited表示禁止准则,如果某个卡牌符合这个准则,那么它就不能以这个技能的拥有者为目标了。禁止准则的函数原型为: `function(self, from, to, card)`。 ![](https://img.kancloud.cn/c4/cf/c4cf26acb8299707fe6b21dec4646c91_598x164.png) </br>☆ 距离修改技,就是跟计算距离相关的技能了,之前我们设计过那个腾云技能就属于这一类,应该是很熟悉了。 </br>创建方法我们也已经使用过了,就是: ``` sgs.CreateDistanceSkill{name, correct_func} ``` </br>所以这部分就忽略掉吧…… ![](https://img.kancloud.cn/fc/44/fc446a49f90f00de27c161f7f7ecf01d_529x152.png) </br>☆ 手牌上限技,就是用来修改手牌上限的技能嘛,很好理解。像血裔、宗室之类的都算的。 </br>创建手牌上限技用到的方法是`sgs.CreateMaxCardsSkill`,原型如下: ``` sgs.CreateMaxCardsSkill{name, extra_func} ``` </br>不用说,`name`肯定又是来表示技能名字的了,而`extra_func`则是用来指导手牌上限修正的了。 </br>和距离修改技中的`correct_func`一样,`extra_func`也是一个返回修正数值的函数,它的函数原型是:`function(self, target)`。 ![](https://img.kancloud.cn/ce/c7/cec7572e13dbc7db67e189a7052c951a_486x155.png) </br>就这样,我们基本上知道了应该如何去创建一个我们需要的技能了。不过是采用对应的创建方法,通过不同的参数传递和处理来表达我们的意愿,达到特定的效果而已。No confusion, now!