无名杀“择权”技能开发:动态技能增减、卡牌操作及同步的注意要点
// 无名杀技能扩展:目标交互选择 // 技能名称:择权 // 触发时机:当玩家使用牌指定其他角色为目标时 game.addSkill({ name: '择权', trigger: { targetBefore: function (event, player) { // 判断当前使用的牌是否有目标,且目标不是自己 if (!event.card || !event.target || player === event.target) return false; return true; } }, filter: function (event, player) { // 确保目标存在且有技能可选 if (!event.target) return false; const target = event.target; const skills = Object.keys(target.skills).filter(skill => lib.skill[skill] && !lib.skill[skill].charlotte // 排除锁定技或不可失去的技能 ); return skills.length > 0 || target.countCards('h') > 0; }, direct: true, content: function () { 'step 0' const target = trigger.target; const availableSkills = Object.keys(target.skills).filter(skill => lib.skill[skill] && !lib.skill[skill].charlotte ); const choices = []; const choiceList = []; if (availableSkills.length > 0) { choices.push('gainSkill'); choiceList.push(`获得${get.translation(target)}的一个技能`); } if (target.countCards('h') > 0) { choices.push('drawCard'); choiceList.push(`让${get.translation(target)}交给你一张手牌`); } player.chooseControl(choices) .set('prompt', get.prompt('择权')) .set('choiceList', choiceList) .set('ai', () => { // AI决策:优先获取强力技能,否则拿牌 if (choices.includes('gainSkill')) return 'gainSkill'; return 'drawCard'; }); 'step 1' if (result.control === 'gainSkill') { const skills = Object.keys(trigger.target.skills).filter(skill => lib.skill[skill] && !lib.skill[skill].charlotte ); player.chooseControl(skills) .set('prompt', '选择一项技能获得') .set('choiceList', skills.map(sk => `<div>${get.translation(sk)}: ${lib.translate[sk]}</div>`)) .set('ai', () => skills[0]); // 简单AI,选第一个 'step 2' if (result.control) { const skillName = result.control; player.gainSkill(skillName); game.log(player, '获得了技能', '#g' + get.translation(skillName)); game.broadcastAll((tgt, skl) => { tgt.removeSkill(skl); // 原角色暂时失去该技能 }, trigger.target, skillName); } } else { player.discardPlayerCard(trigger.target, 'h', true); game.log(player, '从', trigger.target, '获得了一张手牌'); } }, audio: 2, // 可配语音 global: 'mihashizhe_zequan_ai' }); // 全局监听:用于提示AI行为(可选) lib.skill.mihashizhe_zequan_ai = { trigger: { global: 'useCardToBefore' }, silent: true, filter: (event, player) => { return player.hasSkill('择权') && event.player === player; }, content: () => {} }; 我在以往的开发过程中,碰到过以下几点需要小心处理的地方: - 动态增减技能时需注意技能是否为锁定技或永久技,避免移除关键机制导致游戏崩溃 - 使用discardPlayerCard等操作时要判断目标手牌数量,防止空抽引发异常 - 多人异步环境下广播事件必须用game.broadcastAll确保客户端状态同步 ######[AI写代码神器 | 851点数解答 | 2025-10-14 09:07:43]
- Python实现Q老师成绩管理任务:修改与查看学生成绩(字节豆包 | 191点数解答 | 2025-12-20 20:55:41)80
- Python 代码助力 Q 老师高效管理班级学生成绩:修改与查看一键搞定(字节豆包 | 326点数解答 | 2025-12-27 20:48:12)86
- Python开发必懂:同步、异步、阻塞、非阻塞概念全解析(阿里通义 | 263点数解答 | 2023-11-08 00:56:38)239
- 工程师必知:软件系统用户文档编写九大要点揭秘(百度文心 | 350点数解答 | 2023-11-09 18:23:53)197
- 求解整数序列操作最小次数:让前缀和之和等于后缀和之和(DeepSeek | 1329点数解答 | 2025-05-25 17:27:01)231
- C++求解:使整数序列前缀和之和等于后缀和之和的最小操作次数(DeepSeek | 532点数解答 | 2025-05-25 17:27:47)257
- Java实现Student类:含构造、方法及年龄判定(字节豆包 | 464点数解答 | 2024-11-19 15:55:26)389
- Python 实现多功能手机通讯录:添加、查看、删除、修改、查找全搞定!(字节豆包 | 1030点数解答 | 2025-06-05 15:47:56)248
- Golang开发必备:两种实现GET操作的神级方法揭秘!(百度文心 | 465点数解答 | 2023-11-09 18:11:57)250
- 仅一次交换,小写字母字符串能否变身周期字符串?(字节豆包 | 189点数解答 | 2024-10-13 15:08:54)319
- Python实现:O(n)复杂度判断小写字母串能否经一次交换成周期串(字节豆包 | 251点数解答 | 2024-10-13 15:10:03)183
- 巧用箭头函数和 map 方法:将数组元素轻松翻倍!(阿里通义 | 178点数解答 | 2024-10-29 09:35:26)186