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" })
以下是对这段代码的分析与优化建议: 错误分析 1. 语法错误:在 `filter` 函数定义处,JavaScript 里函数定义不能直接写在对象属性里,要使用箭头函数或者传统函数声明。 2. 未定义变量:`get`、`lib`、`ui` 这些变量在代码里未定义,得确保它们在作用域中存在。 3. `when` 方法:`player.when` 这个方法看起来像是自定义方法,要保证其实现和使用是正确的。 优化建议 1. 函数定义:把 `filter` 函数改成箭头函数或者传统函数声明。 2. 代码可读性:添加注释来解释代码的功能,提升代码的可读性。 优化后的代码 ```javascript // 定义技能对象 const skill = { // 音频相关属性,值为 2 audio: 2, // 触发条件 trigger: { global: "useCardToTargeted", }, // 是否强制触发 forced: true, // 是否锁定 locked: false, // 过滤函数,用于筛选事件 filter: (event, player) => { // 如果事件的玩家是当前玩家或者事件目标不是当前玩家,返回 false 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 (event, trigger, player) => { // 玩家监听 useCardAfter 事件,并过滤出与触发事件的父事件相同的事件 await player .when({ global: "useCardAfter" }) .filter(evt => evt === trigger.getParent()) .step(get.info(event.name).contentx); }, // 辅助内容函数 contentx: async (event, trigger, player) => { // 玩家先摸一张牌 await player.draw(); // 玩家选择是否对触发玩家使用一张牌 const result = await player .chooseToUse(`抗明:是否对${get.translation(trigger.player)}使用一张牌?否则你摸三张牌且本技能失效直到你的下回合`) .set("filterTarget", function (card, player, target) { // 获取目标事件 const targetx = get.event("target"); // 如果目标不是目标事件且未被选中,返回 false if (target!== targetx &&!ui.selected.targets.includes(targetx)) { return false; } // 调用 lib.filter.targetEnabled 函数进行目标过滤 return lib.filter.targetEnabled.apply(this, arguments); }) .set("targetRequired", true) .set("complexTarget", true) .set("complexSelect", true) .set("target", trigger.player) .set("addCount", false) .forResult(); // 如果玩家未选择使用牌 if (!result?.bool) { // 玩家摸三张牌 await player.draw(3); // 玩家临时禁用技能直到下回合开始 player.tempBanSkill("dcsbkangming", { player: "phaseBegin" }); } }, // 技能 ID skill_id: "dcsbkangming", }; ``` 需要小心的地方 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 要保证 `get`、`lib`、`ui` 这些变量在代码运行时是已经定义好的,不然会引发 `ReferenceError`。 2. 对于 `player.when` 这种自定义方法,要仔细检查其实现和使用逻辑,防止出现异步问题。 3. 在使用 `apply` 方法调用 `lib.filter.targetEnabled` 时,要确保 `this` 的指向是符合预期的,避免出现上下文相关的错误。 [2025-11-11 22:46:53 | AI写代码神器 | 951点数解答]
- [字节豆包] 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
- [字节豆包] trigger: { player: "useCardToPlayer", }, filter: filter(event, player) { if (!event.isFirstTarget || !["basic", "trick"].includes(get.type(event.card)) || _status.currentPhase !== player) { return false; } if (player.getHistory("useCard", evt => evt?.targets?.length).indexOf(event.getParent()) != 0) { return false; } return game.hasPlayer(current => lib.filter.targetEnabled2(event.card, player, current) && !event.ta(1422点数解答 | 2025-11-11 22:44:00)25
- [讯飞星火] 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)137
- [GPT] jingyu: { audio: 2, trigger: { global: ["useskill", "logskillbegin", "usecard", "respond"], }, filter(event, player) { if (["global", "equip"].includes(event.type)) return false; let skill = event.sourceskill || event.skill; if (!skill || skill === "jingyu") return false; let info = get.info(skill); while (true) { if (!info || info.charlotte || info.equipskill) return false; if (info && !info.sourceskill) break; skill = info.sourceskill; info = get.info((15点数解答 | 2024-06-06 17:40:23)335
- [字节豆包] { 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)18
- [讯飞星火] 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)143
- [字节豆包] 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
- [讯飞星火] skill={ audio:2, trigger:{ player:"useCard", }, frequent:true, filter:function (event,player){ if(!event.cards||event.cards.length!=1) return false; if(_status.currentPhase!=player) return false; if(!player.storage.jianying) return false; return get.suit(player.storage.jianying)==get.suit(event.cards[0])|| player.storage.jianying.number==event.cards[0].number; }, content:function (){ player.draw(); }, (713点数解答 | 2025-07-05 23:27:14)124
- [字节豆包] 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)148
- [字节豆包] 翻译以下代码;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)198
- [DeepSeek] 这是无名杀的一个技能,如何让他去除不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能的限制skill={ unique: true, audio: 2, trigger: { global: "phaseBefore", player: ["enterGame","phaseBegin","phaseEnd"], }, filter(event, player, name) { if (event.name != "phase") return true; if (name == "phaseBefore") return game.phaseNumber == 0; return player.storage.rehuashen?.character?.length > 0; }, async cost(event, trigger, player) { if (trigger.name !== "phase" || event.triggername === "phaseBefore") { event.result = { bool: true, cost_data: ["(556点数解答 | 2025-06-29 08:59:58)151
- [字节豆包] skill={ unique: true, audio: 2, trigger: { global: "phaseBefore", player: ["enterGame","phaseBegin","phaseEnd"], }, filter(event, player, name) { if (event.name != "phase") return true; if (name == "phaseBefore") return game.phaseNumber == 0; return player.storage.rehuashen?.character?.length > 0; }, async cost(event, trigger, player) { if (trigger.name !== "phase" || event.triggername === "phaseBefore") { ev(1573点数解答 | 2025-06-29 08:55:47)107