skill={ enable:"phaseUse", filter:function (event,player){ return !player.hasSkill('subplayer')&&player.getSubPlayers('lingyong_get').length>0; }, nosub:true, group:"lingyong_get", direct:true, delay:0, skillAnimation:true, animationColor:"thunder", content:function (){ player.callSubPlayer().set('tag','lingyong_get'); }, ai:{ order:1, result:{ player:function (player,target){ return 1;
代码分析 这段代码定义了一个技能对象 `skill`,包含了技能的启用条件、过滤函数、分组、动画等属性,还有AI决策逻辑和子技能定义。 代码优化建议 1. 变量作用域问题:在 `content` 函数中使用了 `player` 变量,但没有在函数内部声明,应该通过参数传递进来。 2. 代码部分代码注释掉了,可根据实际情况决定是否保留或删除。 3. 数组方法兼容性:`contains` 方法不是原生 JavaScript 数组的方法,可使用 `includes` 代替。 优化后的代码 ```javascript // 定义技能对象 const skill = { enable: "phaseUse", // 过滤函数,判断玩家是否满足技能使用条件 filter: function (event, player) { return !player.hasSkill('subplayer') && player.getSubPlayers('lingyong_get').length > 0; }, nosub: true, group: "lingyong_get", direct: true, delay: 0, skillAnimation: true, animationColor: "thunder", // 技能执行内容 content: function (player) { player.callSubPlayer().set('tag', 'lingyong_get'); }, ai: { order: 1, result: { // AI 决策函数,根据玩家情况返回决策结果 player: function (player, target) { return 1; // if(player.hp<=1) return 1; // if(!player.needsToDiscard(player.hp-1)) return 1; // return 0; }, }, }, subSkill: { get: { trigger: { global: "dieAfter", }, forced: true, // 子技能过滤函数 filter: function (event, player) { return !event.player.isMin() && ![player.name, player.name1, player.name2].includes(event.player.name); }, // 子技能执行内容 content: function (player, trigger) { const skills = lib.character[trigger.player.name][3].slice(0); for (let i = 0; i < skills.length; i++) { if (lib.skill[skills[i]].nosub) { skills.splice(i--, 1); } } player.addSubPlayer({ name: trigger.player.name, skills: skills, hs: get.cards(2), intro: '出牌阶段,你可以调遣此随从(直到随从死亡不可再次切换)' }); }, sub: true, }, }, }; ``` 需要小心的地方 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 确保 `lib` 对象在使用前已经正确初始化,否则会导致 `lib.character` 或 `lib.skill` 访问出错。 2. `get.cards(2)` 函数的实现需要保证其返回值的正确性,避免因返回值异常导致后续代码出错。 3. 在使用 `splice` 方法修改数组时,要注意数组索引的变化,避免出现意外的结果。 [2025-08-20 11:51:16 | AI写代码神器 | 763点数解答]
- [字节豆包] skill={ enable:"phaseUse", filter:function (event,player){ return !player.hasSkill('subplayer')&&player.getSubPlayers('lingyong_get').length>0; }, nosub:true, group:"lingyong_get", direct:true, delay:0, skillAnimation:true, animationColor:"thunder", content:function (){ player.callSubPlayer().set('tag','lingyong_get'); }, ai:{ order:1, result:{ player:function (player,target){ return 1; (763点数解答 | 2025-08-20 11:51:16)81
- [讯飞星火] skill={ trigger:{ player:"shaBegin", }, direct:true, filter:function (event,player){ return event.target.hp>0&&event.target.countCards('he')>0; }, audio:2, logTarget:"target", content:function (){ 'step 0' player.choosePlayerCard(trigger.target,'he', [1,Math.min(trigger.target.countCards('he'),trigger.target.hp)],get.prompt('pojun',trigger.target)); 'step 1' if(result.bool&&result.links.length){ player.logSkill('xinpojun'); if(trigger.target.storage.xinpojun2){ trigger.target.storage.xinpojun2=t(288点数解答 | 2025-07-06 23:39:34)138
- [讯飞星火] skill={ trigger:{ player:"shaBegin", }, direct:true, filter:function (event,player){ return event.target.hp>0&&event.target.countCards('he')>0; }, audio:2, logTarget:"target", content:function (){ 'step 0' player.choosePlayerCard(trigger.target,'he', [1,Math.min(trigger.target.countCards('he'),trigger.target.hp)],get.prompt('pojun',trigger.target)); 'step 1' if(result.bool&&result.links.length){ (286点数解答 | 2025-07-06 23:35:52)144
- [字节豆包] { audio:2, audioname:["re_liufeng"], trigger:{ player:"phaseZhunbeiBegin", }, direct:true, content:function () { "step 0"; player.chooseTarget( get.prompt2(event.name), [1, 2], function (card, player, target) { return target.countCards("he") > 0; }, function (target) { return -get.attitude(_status.event.player, target); } ); "step 1"; if (result.bool) { result.targets.sortBySeat(); player.logSkill(event.name, result.targets); event.targets = result.targets; } else { event.finish(); } "step 2"; i(2075点数解答 | 2025-11-16 13:40:21)19
- [字节豆包] 翻译以下代码;skill={ audio:3, trigger:{ player:"phaseUseBegin", }, filter:function(event,player){ return game.hasPlayer(target=>target!=player&&!target.isZhu2()); }, direct:true, content:function(){ 'step 0' player.chooseTarget(get.prompt('sbwusheng'),'选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用五张【杀】后不能对其使用【杀】',(card,player,target)=>{ return target!=player&&!target.isZhu2(); }).set('ai',target=>{ var (522点数解答 | 2025-05-24 13:13:19)199
- [字节豆包] skill={ trigger:{ global:"useCard1", }, audio:2, forced:true, firstDo:true, filter:function(event,player,card){ if(get.color(event.card)!='black') return false; return event.card.name=='nanman'&&player!=event.player||event.card.name=='wanjian'&&player!=event.player||event.card.name=='taoyuan'&&player.hp<player.maxHp||event.card.name=='wugu'; }, content:function(){}, mod:{ targetEnabled:function(card){ if((get.type(ca(211点数解答 | 2025-02-01 13:23:26)235
- [字节豆包] content: async function(event, trigger, player) { const [target] = event.targets; const [card] = event.cards; trigger.cancel(); await player.discard(event.cards); const { result } = await player.chooseControlList( true, function(event, player) { const target = _status.event.target; let att = get.attitude(player, target); if (target.hasSkillTag("maihp")) att = -att; return att > 0 ? 0 : 1; }, ["令" (179点数解答 | 2025-05-17 20:49:48)149
- [讯飞星火] skill={ audio:2, trigger:{ player:["loseEnd","changeHp"], }, forced:true, filter:function (event,player){ return (player.countCards('h')<Math.min(3,player.maxHp-player.hp)); }, content:function (){ player.draw(Math.min(3,player.maxHp-player.hp)-player.countCards('h')); }, ai:{ noh:true, skillTagFilter:function (player,tag){ if(tag=='noh'&&player.maxHp-player.hp<player.countCards('h')){ return (331点数解答 | 2025-07-01 12:15:43)119
- [字节豆包] skill={ audio:"ext:我的扩展:2", trigger:{ player:"damageEnd", }, filter:function(event,player){ for(var i of lib.skill.谋攻.derivation){ if(!player.hasSkill(i,null,null,false)) return true; } return false; }, forced:true, content:function(){ for(var i of lib.skill.谋攻.derivation){ if(!player.hasSkill(i,null,null,false)){ randomGets(result.cards.length) player.addSkillLog(i); (589点数解答 | 2025-08-14 11:20:36)80
- [字节豆包] skill={ audio:"ext:我的扩展:2", trigger:{ player:"damageEnd", }, filter:function(event,player){ for(var i of lib.skill.谋攻.derivation){ if(!player.hasSkill(i,null,null,false)) return true; } return false; }, forced:true, content:function(){ for(var i of lib.skill.谋攻.derivation){ if(!player.hasSkill(i,null,null,false)){ randomGets(result.cards.length) player.addSkillLog(i); (692点数解答 | 2025-08-14 11:22:49)90
- [字节豆包] skill={ audio: 2, trigger: { global: "useCardToTargeted", }, forced: true, locked: false, filter: filter(event, player) { if (event.player == player || event.target != player) { return false; } return event.player.getHistory("useCard", evt => evt?.targets.includes(player)).indexOf(event.getParent()) > 0; }, content: async content(event, trigger, player) { player .when({ global: "useCardAfter" }) (951点数解答 | 2025-11-11 22:46:53)43
- [字节豆包] skill={ trigger: { player: "loseEnd", }, frequent: true, filter(event, player) { if (player.countCards("h")) return false; for (var i = 0; i < event.cards.length; i++) { if (event.cards[i].original == "h") return true; } return false; }, content() { player.draw(2); }, ai: { noh: true, skillTagFilter(player, tag, arg) { if (tag === "noh") return player.countCards("h") === 1; (810点数解答 | 2025-06-26 13:35:10)139