skill={ audio: 2, "audioname2": { "gz_jun_caocao": "jianan_qiaobian", }, trigger: { player: ["phaseJudgeBefore","phaseDrawBefore","phaseUseBefore","phaseDiscardBefore"], }, filter(event, player) { return player.countCards("h") > 0; }, preHidden: true, async cost(event, trigger, player) { let check, str = "弃置一张手牌并跳过"; str += ["判定", "摸牌", "出牌", "弃牌"][lib.skill.qiaobian.trigger.player.indexOf(event.triggername)]
代码分析 整体功能 这段代码定义了一个名为 `skill` 的对象,该对象描述了一个游戏技能的相关属性和行为。技能在特定阶段触发,玩家可以通过弃置一张手牌并跳过相应阶段来发动技能,在不同阶段发动技能还会有额外效果,如获得其他角色手牌或移动场上的牌。 潜在问题及改进建议 1. 变量未定义问题 - `lib`、`game`、`get` 等对象未定义,在使用这些对象的方法时会导致运行时错误。需要确保这些对象在代码运行环境中已经正确定义。 2. 代码可读性 - 代码中使用了较多的硬编码字符串,如 `["判定", "摸牌", "出牌", "弃牌"]`,可以将其提取为常量,提高代码的可读性和可维护性。 3. 异步操作异常处理 - 在 `cost` 和 `content` 方法中使用了 `await` 进行异步操作,但没有进行异常处理。建议添加 `try...catch` 块来捕获可能的异常。 改进后的代码 ```javascript // 定义常量,提高代码可读性 const PHASE_NAMES = ["判定", "摸牌", "出牌", "弃牌"]; const skill = { audio: 2, "audioname2": { "gz_jun_caocao": "jianan_qiaobian", }, trigger: { player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore"], }, filter(event, player) { return player.countCards("h") > 0; }, preHidden: true, async cost(event, trigger, player) { try { let check; let str = "弃置一张手牌并跳过"; str += PHASE_NAMES[lib.skill.qiaobian.trigger.player.indexOf(event.triggername)]; str += "阶段"; if (trigger.name === "phaseDraw") { str += ",然后可以获得至多两名角色各一张手牌"; } if (trigger.name === "phaseUse") { str += ",然后可以移动场上的一张牌"; } switch (trigger.name) { case "phaseJudge": check = player.countCards("j"); break; case "phaseDraw": { let i, num = 0, num2 = 0; const players = game.filterPlayer(); for (i = 0; i < players.length; i++) { if (player !== players[i] && players[i].countCards("h")) { const att = get.attitude(player, players[i]); if (att <= 0) { num++; } if (att < 0) { num2++; } } } check = num >= 2 && num2 > 0; break; } case "phaseUse": if (!player.canMoveCard(true)) { check = false; } else { check = game.hasPlayer(function (current) { return get.attitude(player, current) > 0 && current.countCards("j"); }); if (!check) { if (player.countCards("h") > player.hp + 1) { check = false; } else if (player.countCards("h", { name: "wuzhong" })) { check = false; } else { check = true; } } } break; case "phaseDiscard": check = player.needsToDiscard(); break; } event.result = await player .chooseToDiscard(get.prompt(event.skill), str, lib.filter.cardDiscardable) .set("ai", card => { if (!_status.event.check) { return -1; } return 7 - get.value(card); }) .set("check", check) .setHiddenSkill(event.skill) .forResult(); } catch (error) { console.error('技能cost方法出错:', error); } }, async content(event, trigger, player) { try { trigger.cancel(); game.log(player, "跳过了", "#y" + PHASE_NAMES[lib.skill.qiaobian.trigger.player.indexOf(event.triggername)] + "阶段"); if (trigger.name === "phaseUse") { if (player.canMoveCard()) { await player.moveCard(); } } else if (trigger.name === "phaseDraw") { const { result } = await player .chooseTarget([1, 2], "获得至多两名角色各一张手牌", function (card, player, target) { return target !== player && target.countCards("h"); }) .set("ai", function (target) { return 1 - get.attitude(_status.event.player, target); }); if (!result.bool) { return; } result.targets.sortBySeat(); player.line(result.targets, "green"); if (!result.targets.length) { return; } await player.gainMultiple(result.targets); await game.delay(); } } catch (error) { console.error('技能content方法出错:', error); } }, ai: { threaten: 3, }, }; ``` 需要小心处理的地方 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 确保 `lib`、`game`、`get` 等对象在代码运行环境中已经正确定义,否则会导致运行时错误。 2. 异步操作可能会抛出异常,建议在使用 `await` 的地方添加 `try...catch` 块进行异常处理。 3. 硬编码的字符串和数组索引可能会导致代码难以维护,尽量将其提取为常量。 [2025-10-16 15:31:36 | AI写代码神器 | 1426点数解答]
- [字节豆包] skill={ audio: 2, "audioname2": { "gz_jun_caocao": "jianan_qiaobian", }, trigger: { player: ["phaseJudgeBefore","phaseDrawBefore","phaseUseBefore","phaseDiscardBefore"], }, filter(event, player) { return player.countCards("h") > 0; }, preHidden: true, async cost(event, trigger, player) { let check, str = "弃置一张手牌并跳过"; str += ["判定", "摸牌", "出牌", "弃牌"][lib.skill.qiaobian.trigger.player.indexOf(event.triggername)](1426点数解答 | 2025-10-16 15:31:36)38
- [字节豆包] 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={ 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
- [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)152
- [字节豆包] 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)108
- [讯飞星火] 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:{ 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
- [字节豆包] 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)26
- [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)336
- [字节豆包] 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
- [字节豆包] 这是无名杀的一个技能,如何让他去除不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能的限制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(1326点数解答 | 2025-06-29 08:57:51)159
- [讯飞星火] 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