From 7a05c0355e7cb00d294bdb820644128f782a468a Mon Sep 17 00:00:00 2001 From: ycyutian <2414374457@qq.com> Date: Sun, 24 May 2026 11:52:51 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=AD=94=E5=91=A8?= =?UTF-8?q?=E7=91=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/sxrm/character.js | 10 + apps/core/character/sxrm/characterTitle.js | 2 + apps/core/character/sxrm/skill.js | 267 +++++++++++++++++++++ apps/core/character/sxrm/sort.js | 2 + apps/core/character/sxrm/translate.js | 9 + 5 files changed, 290 insertions(+) diff --git a/apps/core/character/sxrm/character.js b/apps/core/character/sxrm/character.js index dcd37e37f4..9a0871818d 100644 --- a/apps/core/character/sxrm/character.js +++ b/apps/core/character/sxrm/character.js @@ -1,4 +1,14 @@ +import skills from "./skill"; + const characters = { + //嗔 + sxrm_zhouyu:{ + sex:"male", + group: "devil", + hp: 4, + skills:["sxrmjiehuo","sxrmxianger","sxrmmieguo"], + groupInGuozhan: "wu", + }, //慢 sxrm_guanyu: { sex: "male", diff --git a/apps/core/character/sxrm/characterTitle.js b/apps/core/character/sxrm/characterTitle.js index a565457389..a5085bbf78 100644 --- a/apps/core/character/sxrm/characterTitle.js +++ b/apps/core/character/sxrm/characterTitle.js @@ -1,4 +1,6 @@ export default { + sxrm_zhouyu:"哀弦万耳惊", + sxrm_guanyu: "四海仰鼻息", sxrm_guanyinping: "天骄虎女", sxrm_yujin: "立地成佛", diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js index aed7095546..e99787e892 100644 --- a/apps/core/character/sxrm/skill.js +++ b/apps/core/character/sxrm/skill.js @@ -1,7 +1,274 @@ +// @ts-nocheck import { lib, game, ui, get, ai, _status } from "noname"; /** @type { importCharacterConfig["skill"] } */ const skills = { + //嗔包 + //魔周瑜 + sxrmjiehuo: { + audio: 2, + dutySkill: true, + trigger: { + player: "phaseBegin", + }, + async cost(event, trigger, player){ + event.result = await player.chooseBool('是否令本局游戏的下次伤害改为3点火焰伤害?') + .set('ai',()=>{ + const player = get.player(); + return player.getCards('h').some(card=>{ + return get.tag(card,'damage') && player.getUseValue(card); + }) + }) + .forResult(); + }, + async content(event, trigger, player) { + player.storage.sxrmjiehuo_mark = true; + player.markSkill('sxrmjiehuo'); + }, + intro: { + content: "本局下次伤害改为3点火焰伤害", + }, + group: ["sxrmjiehuo_damage"], + subSkill: { + damage: { + trigger: { + global: "damageBegin1", + }, + forced: true, + filter(event, player) { + return player.storage.sxrmjiehuo_mark; + }, + async content(event, trigger, player){ + player.unmarkSkill('sxrmjiehuo'); + delete player.storage.sxrmjiehuo_mark; + trigger.num = 3; + trigger.nature = 'fire'; + player.line(trigger.source); + game.log(player, '令', trigger.source, '造成的伤害改为3点火焰伤害'); + if(trigger.source!=player){ + player.when({ global: "damageEnd" }).filter(evt => evt == trigger).then(() => { + player.awakenSkill('sxrmjiehuo'); + game.log(player, `【${get.translation('sxrmjiehuo')}】`, '使命失败'); + player.loseMaxHp(); + }); + } + }, + sub: true, + parentskill: "sxrmjiehuo", + "_priority": 0, + }, + }, + "_priority": 0, + }, + sxrmxianger: { + audio: 2, + dutySkill: true, + enable: "phaseUse", + usable: 1, + filterTarget:true, + async content(event, trigger, player){ + const target = event.target; + player.logSkill('sxrmxianger', target); + target.addTempSkill('sxrmxianger_limit', { player: 'phaseEnd' }); + target.addMark('sxrmxianger_limit',2,false); + player.addSkill('sxrmxianger_mark'); + if (!player.getStorage('sxrmxianger_mark')?.some(i => { + return i.target == target; + })) { + let tmp = { target: target, damage: 0 }; + player.markAuto('sxrmxianger_mark', tmp); + } + }, + subSkill: { + mark:{ + intro:{ + content(storage,player){ + if(!storage?.length) return '目前没有【香饵】目标'; + else{ + let str = '【香饵】目标受伤情况:'; + storage.forEach(i=>{ + str+='
'+get.translation(i.target)+':'+i.damage+'。'; + }) + return str; + } + }, + }, + onremove:true, + charlotte:true, + sub:true, + parentskill: "sxrmxianger", + "_priority": 0, + }, + limit: { + charlotte: true, + forced: true, + mark: true, + popup:false, + onremove:true, + intro: { + content(storage,player){ + return `
  • 不能使用点数大于6的牌
  • 下个结束阶段回复${player.countMark('sxrmxianger_limit')}点体力` + }, + }, + mod: { + cardEnabled: function (card, player) { + var num = get.number(card); + if (typeof num == 'number' && num > 6) return false; + }, + cardSavable: function (card, player) { + var num = get.number(card); + if (typeof num == 'number' && num > 6) return false; + }, + }, + trigger: { + player: ["phaseJieshuBegin", "damageEnd"], + }, + filter(event,player){ + if(event.name=='damage'){ + return game.countPlayer(target => { + return target.hasSkill('sxrmxianger') && target.getStorage('sxrmxianger_mark')?.some(i=>i.target==player); + }) + } + return true; + }, + async content(event, trigger, player){ + if (trigger.name == 'damage') { + game.filterPlayer(target => { + return target.hasSkill('sxrmxianger') && target.getStorage('sxrmxianger_mark')?.some(i=>i.target==player); + }).forEach(target =>{ + target.storage.sxrmxianger_mark.find(i=>i.target==player).damage+=trigger.num; + }) + } + else { + player.recover(player.countMark('sxrmxianger_limit')); + let targets = game.filterPlayer(target => { + return target.hasSkill('sxrmxianger') && target.getStorage('sxrmxianger_mark')?.some(i=>i.target==player); + }); + if(targets.length){ + targets.forEach(target =>{ + let item = target.storage.sxrmxianger_mark.find(i=>i.target==player); + let num = item.damage; + target.storage.sxrmxianger_mark.remove(item); + if(num<2){ + target.line(player); + game.log(target,'【香饵】使命失败'); + target.awakenSkill('sxrmxianger'); + target.loseMaxHp(); + } + }); + } + player.removeSkill(event.name); + } + }, + sub: true, + parentskill: "sxrmxianger", + "_priority": 0, + }, + }, + ai:{ + order:10, + result:{ + target(player,target){ + if(player.hasSkill('sxrmxianger_limit') || get.attitude(player,target)>0 || player==target || !player.storage.sxrmjiehuo_mark) return 0; + let val = get.damageEffect(target, player, player); + if(player.inRange(target)) val++; + return -val; + }, + } + }, + "_priority": 0, + }, + sxrmmieguo: { + audio: 2, + dutySkill: true, + trigger: { + player: "phaseEnd", + }, + filter(event, player) { + return !event.skill; + }, + async cost(event, trigger, player){ + event.result = await player.chooseTarget(get.prompt('sxrmmieguo'),'获得一名其他角色的至多3张牌', function (card, player, target){ + return target!=player && target.countCards('he'); + }).set('ai',target=>{ + const player = get.player(); + if(get.attitude(player,target)>0 && target.countCards('he')>=4) return 10; + if(get.attitude(player,target)<0) return 5; + return -1; + }).forResult(); + }, + async content(event, trigger, player){ + const target = event.targets[0]; + const cards = await player.choosePlayerCard(target, '选择至多3张牌获得', "he", [1, 3],true).set("ai", button=> { + const player = get.player(); + if(ui.selected.buttons?.length) return -1; + if(get.attitude(player,target)>0){ + if(get.position(button.link)=='h') return 5; + return 1; + } + else{ + return 1; + } + }).forResult('cards'); + if(!cards?.length) { event.finish(); return; } + const num = cards.length; + player.gain(cards, target, "give"); + const targetsx = game.countPlayer()<=num ? game.filterPlayer() + : await target.chooseTarget(`选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`, true, num).set("ai", target=>{ + if(target==get.player) return 5; + return 1; + }).forResult('targets'); + if (!targetsx?.length) { event.finish(); return; } + player.addSkill('sxrmmieguo_ban'); + player.markAuto('sxrmmieguo_ban',targetsx); + game.log(player, "执行了一个额外回合"); + player.insertPhase(); + }, + subSkill: { + ban: { + charlotte: true, + forced: true, + onremove: true, + popup:false, + intro: { + content(storage) { + if (!storage?.length) return ""; + let list = []; + for (let i of storage) { + list.push(get.translation(i)); + } + return "不能对" + list.join("、") + "使用牌"; + }, + }, + mod: { + playerEnabled: function (card, player, target) { + if (player.getStorage('sxrmmieguo_ban')?.includes(target)) { + return false; + } + }, + }, + trigger: { + player: "phaseJieshuBegin", + }, + filter(event,player){ + return event.getParent('phase').skill == 'sxrmmieguo'; + }, + async content(event, trigger, player){ + player.removeSkill(event.name); + if (!player.getHistory("useCard").length) { + game.log(player, "【灭虢】使命失败"); + player.awakenSkill("sxrmmieguo"); + player.loseMaxHp(); + } + }, + sub: true, + parentskill: "sxrmmieguo", + "_priority": 0, + }, + }, + "_priority": 0, + }, + //曼巴 //关羽 sxrmhanguo: { diff --git a/apps/core/character/sxrm/sort.js b/apps/core/character/sxrm/sort.js index 842fa63e12..4f85bf94c0 100644 --- a/apps/core/character/sxrm/sort.js +++ b/apps/core/character/sxrm/sort.js @@ -1,11 +1,13 @@ const characterSort = { shixinrumo_yi: ["sxrm_caocao", "sxrm_liubei", "sxrm_jianggan", "sxrm_huatuo", "sxrm_lvboshe", "sxrm_fuhuanghou", "sxrm_xunyu", "sxrm_caopi", "sxrm_wanghou"], shixinrumo_man: ["sxrm_guanyu", "sxrm_guanyinping", "sxrm_yujin", "sxrm_mifang", "sxrm_liufeng", "sxrm_luxun", "sxrm_lvmeng", "sxrm_pangde", "sxrm_yanwen"], + shixinrumo_chen: ["sxrm_zhouyu"], }; const characterSortTranslate = { shixinrumo_yi: "蚀心入魔·疑", shixinrumo_man: "蚀心入魔·慢", + shixinrumo_chen: "蚀心入魔·嗔", }; export { characterSort, characterSortTranslate }; diff --git a/apps/core/character/sxrm/translate.js b/apps/core/character/sxrm/translate.js index e3a6cbc6f0..3a514da360 100644 --- a/apps/core/character/sxrm/translate.js +++ b/apps/core/character/sxrm/translate.js @@ -107,6 +107,15 @@ const translates = { sxrmhaibian_info: "一名角色的回合开始时,若你上回合使用过手牌,则上回合最后一张黑色牌和红色牌的使用者可以依次视为使用一张【决斗】。", sxrmqiewang: "怯亡", sxrmqiewang_info: "锁定技,你距离1以内的角色受到伤害后,你摸一张牌,令你的手牌本回合均视为【无懈可击】。", + //蚀心入魔·嗔 + sxrm_zhouyu:'魔周瑜', + sxrm_zhouyu_prefix:'魔', + sxrmjiehuo: "劫火", + sxrmjiehuo_info: "使命技,回合开始时,你可以令场上下次出现的伤害改为3点火焰伤害。失败:若造成此伤害的角色不为你:你减1点体力上限。", + sxrmxianger: "香饵", + sxrmxianger_info: "使命技,出牌阶段限一次,你可以令一名角色于其下个结束阶段回复2点体力,期间其不能使用点数大于6的牌。失败:期间其受到的伤害值小于2:你减1点体力上限。", + sxrmmieguo: "灭虢", + sxrmmieguo_info:"使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌:你减1点体力上限。", }; export default translates; From c32895fddfd80ec4415a58e316ed64e096e66fd8 Mon Sep 17 00:00:00 2001 From: rintim Date: Sun, 24 May 2026 17:03:12 +0800 Subject: [PATCH 02/12] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BB=A5=E5=8F=8A=E4=B8=80=E4=BA=9B=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E5=9C=B0=E6=96=B9=EF=BC=8C=E5=90=8C=E6=AD=A5=E6=96=B0?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/sxrm/character.js | 8 +- apps/core/character/sxrm/characterTitle.js | 2 +- apps/core/character/sxrm/skill.js | 320 +++++++++++---------- apps/core/character/sxrm/temp.js | 108 +++++++ apps/core/character/sxrm/translate.js | 6 +- 5 files changed, 291 insertions(+), 153 deletions(-) create mode 100644 apps/core/character/sxrm/temp.js diff --git a/apps/core/character/sxrm/character.js b/apps/core/character/sxrm/character.js index 9a0871818d..54b89dc8d9 100644 --- a/apps/core/character/sxrm/character.js +++ b/apps/core/character/sxrm/character.js @@ -1,12 +1,10 @@ -import skills from "./skill"; - const characters = { //嗔 - sxrm_zhouyu:{ - sex:"male", + sxrm_zhouyu: { + sex: "male", group: "devil", hp: 4, - skills:["sxrmjiehuo","sxrmxianger","sxrmmieguo"], + skills: ["sxrmjiehuo", "sxrmxianger", "sxrmmieguo"], groupInGuozhan: "wu", }, //慢 diff --git a/apps/core/character/sxrm/characterTitle.js b/apps/core/character/sxrm/characterTitle.js index a5085bbf78..c9d11e76b7 100644 --- a/apps/core/character/sxrm/characterTitle.js +++ b/apps/core/character/sxrm/characterTitle.js @@ -1,5 +1,5 @@ export default { - sxrm_zhouyu:"哀弦万耳惊", + sxrm_zhouyu: "哀弦万耳惊", sxrm_guanyu: "四海仰鼻息", sxrm_guanyinping: "天骄虎女", diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js index e99787e892..9714a0c93b 100644 --- a/apps/core/character/sxrm/skill.js +++ b/apps/core/character/sxrm/skill.js @@ -1,4 +1,3 @@ -// @ts-nocheck import { lib, game, ui, get, ai, _status } from "noname"; /** @type { importCharacterConfig["skill"] } */ @@ -11,19 +10,20 @@ const skills = { trigger: { player: "phaseBegin", }, - async cost(event, trigger, player){ - event.result = await player.chooseBool('是否令本局游戏的下次伤害改为3点火焰伤害?') - .set('ai',()=>{ - const player = get.player(); - return player.getCards('h').some(card=>{ - return get.tag(card,'damage') && player.getUseValue(card); + async cost(event, trigger, player) { + event.result = await player + .chooseBool({ + prompt: "是否令本局游戏的下次伤害改为3点火焰伤害?", + ai() { + const player = get.player(); + return player.hasCards("h", card => get.tag(card, "damage") && player.getUseValue(card)); + }, }) - }) - .forResult(); + .forResult(); }, async content(event, trigger, player) { player.storage.sxrmjiehuo_mark = true; - player.markSkill('sxrmjiehuo'); + player.markSkill("sxrmjiehuo"); }, intro: { content: "本局下次伤害改为3点火焰伤害", @@ -38,145 +38,134 @@ const skills = { filter(event, player) { return player.storage.sxrmjiehuo_mark; }, - async content(event, trigger, player){ - player.unmarkSkill('sxrmjiehuo'); + async content(event, trigger, player) { + player.unmarkSkill("sxrmjiehuo"); delete player.storage.sxrmjiehuo_mark; + game.setNature(trigger, "fire"); trigger.num = 3; - trigger.nature = 'fire'; player.line(trigger.source); - game.log(player, '令', trigger.source, '造成的伤害改为3点火焰伤害'); - if(trigger.source!=player){ - player.when({ global: "damageEnd" }).filter(evt => evt == trigger).then(() => { - player.awakenSkill('sxrmjiehuo'); - game.log(player, `【${get.translation('sxrmjiehuo')}】`, '使命失败'); - player.loseMaxHp(); - }); + game.log(player, "令", trigger.source, "造成的伤害改为3点火焰伤害"); + if (trigger.source !== player) { + player + .when({ global: "damageEnd" }) + .filter(evt => evt === trigger) + .then(async (event, trigger, player) => { + player.awakenSkill("sxrmjiehuo"); + game.log(player, `【${get.translation("sxrmjiehuo")}】`, "使命失败"); + await player.loseMaxHp(); + }); } }, sub: true, - parentskill: "sxrmjiehuo", - "_priority": 0, }, }, - "_priority": 0, }, sxrmxianger: { audio: 2, dutySkill: true, enable: "phaseUse", usable: 1, - filterTarget:true, - async content(event, trigger, player){ + filterTarget: true, + async content(event, trigger, player) { const target = event.target; - player.logSkill('sxrmxianger', target); - target.addTempSkill('sxrmxianger_limit', { player: 'phaseEnd' }); - target.addMark('sxrmxianger_limit',2,false); - player.addSkill('sxrmxianger_mark'); - if (!player.getStorage('sxrmxianger_mark')?.some(i => { - return i.target == target; - })) { - let tmp = { target: target, damage: 0 }; - player.markAuto('sxrmxianger_mark', tmp); + player.logSkill("sxrmxianger", target); + target.addTempSkill("sxrmxianger_limit", { player: "phaseEnd" }); + target.addMark("sxrmxianger_limit", 2, false); + player.addSkill("sxrmxianger_mark"); + if (!player.getStorage("sxrmxianger_mark")?.some(i => i.target === target)) { + let tmp = { target, damage: 0 }; + player.markAuto("sxrmxianger_mark", tmp); } }, subSkill: { - mark:{ - intro:{ - content(storage,player){ - if(!storage?.length) return '目前没有【香饵】目标'; - else{ - let str = '【香饵】目标受伤情况:'; - storage.forEach(i=>{ - str+='
    '+get.translation(i.target)+':'+i.damage+'。'; - }) + mark: { + intro: { + content(storage, player) { + if (!storage?.length) { + return "目前没有【香饵】目标"; + } else { + let str = "【香饵】目标受伤情况:"; + storage.forEach(i => { + str += "
    " + get.translation(i.target) + ":" + i.damage + "。"; + }); return str; } }, }, - onremove:true, - charlotte:true, - sub:true, - parentskill: "sxrmxianger", - "_priority": 0, + onremove: true, + charlotte: true, + sub: true, }, limit: { charlotte: true, forced: true, mark: true, - popup:false, - onremove:true, + popup: false, + onremove: true, intro: { - content(storage,player){ - return `
  • 不能使用点数大于6的牌
  • 下个结束阶段回复${player.countMark('sxrmxianger_limit')}点体力` + content(storage, player) { + return ``; }, }, mod: { - cardEnabled: function (card, player) { - var num = get.number(card); - if (typeof num == 'number' && num > 6) return false; + cardEnabled(card, player) { + const num = get.number(card); + if (typeof num === "number" && num > 6) { + return false; + } }, - cardSavable: function (card, player) { - var num = get.number(card); - if (typeof num == 'number' && num > 6) return false; + cardSavable(card, player) { + const num = get.number(card); + if (typeof num === "number" && num > 6) { + return false; + } }, }, trigger: { player: ["phaseJieshuBegin", "damageEnd"], }, - filter(event,player){ - if(event.name=='damage'){ - return game.countPlayer(target => { - return target.hasSkill('sxrmxianger') && target.getStorage('sxrmxianger_mark')?.some(i=>i.target==player); - }) + filter(event, player) { + if (event.name === "damage") { + return game.hasPlayer(target => target.hasSkill("sxrmxianger") && target.getStorage("sxrmxianger_mark")?.some(i => i.target === player)); } return true; }, - async content(event, trigger, player){ - if (trigger.name == 'damage') { - game.filterPlayer(target => { - return target.hasSkill('sxrmxianger') && target.getStorage('sxrmxianger_mark')?.some(i=>i.target==player); - }).forEach(target =>{ - target.storage.sxrmxianger_mark.find(i=>i.target==player).damage+=trigger.num; - }) - } - else { - player.recover(player.countMark('sxrmxianger_limit')); - let targets = game.filterPlayer(target => { - return target.hasSkill('sxrmxianger') && target.getStorage('sxrmxianger_mark')?.some(i=>i.target==player); - }); - if(targets.length){ - targets.forEach(target =>{ - let item = target.storage.sxrmxianger_mark.find(i=>i.target==player); - let num = item.damage; - target.storage.sxrmxianger_mark.remove(item); - if(num<2){ - target.line(player); - game.log(target,'【香饵】使命失败'); - target.awakenSkill('sxrmxianger'); - target.loseMaxHp(); - } - }); + async content(event, trigger, player) { + if (trigger.name === "damage") { + for (const target of game.filterPlayer(target => target.hasSkill("sxrmxianger") && target.getStorage("sxrmxianger_mark")?.some(i => i.target === player))) { + target.storage.sxrmxianger_mark.find(i => i.target === player).damage += trigger.num; + } + } else { + await player.recover({ num: player.countMark("sxrmxianger_limit") }); + const targets = game.filterPlayer(target => target.hasSkill("sxrmxianger") && target.getStorage("sxrmxianger_mark")?.some(i => i.target === player)); + for (const target of targets) { + const item = target.storage.sxrmxianger_mark.find(i => i.target === player); + const num = item.damage; + target.storage.sxrmxianger_mark.remove(item); + if (num < 2) { + target.line(player); + game.log(target, "【香饵】使命失败"); + target.awakenSkill("sxrmxianger"); + await target.loseMaxHp(); + } } player.removeSkill(event.name); } }, sub: true, - parentskill: "sxrmxianger", - "_priority": 0, }, }, - ai:{ - order:10, - result:{ - target(player,target){ - if(player.hasSkill('sxrmxianger_limit') || get.attitude(player,target)>0 || player==target || !player.storage.sxrmjiehuo_mark) return 0; + ai: { + order: 10, + result: { + target(player, target) { + if (player.hasSkill("sxrmxianger_limit") || get.attitude(player, target) > 0 || player == target || !player.storage.sxrmjiehuo_mark) return 0; let val = get.damageEffect(target, player, player); - if(player.inRange(target)) val++; + if (player.inRange(target)) val++; return -val; }, - } + }, }, - "_priority": 0, }, sxrmmieguo: { audio: 2, @@ -187,40 +176,85 @@ const skills = { filter(event, player) { return !event.skill; }, - async cost(event, trigger, player){ - event.result = await player.chooseTarget(get.prompt('sxrmmieguo'),'获得一名其他角色的至多3张牌', function (card, player, target){ - return target!=player && target.countCards('he'); - }).set('ai',target=>{ - const player = get.player(); - if(get.attitude(player,target)>0 && target.countCards('he')>=4) return 10; - if(get.attitude(player,target)<0) return 5; - return -1; - }).forResult(); - }, - async content(event, trigger, player){ + async cost(event, trigger, player) { + event.result = await player + .chooseTarget({ + prompt: get.prompt("sxrmmieguo"), + prompt2: "获得一名其他角色的至多3张牌", + filterTarget(card, player, target) { + return target !== player && target.hasCards("he"); + }, + ai(target) { + const player = get.player(); + if (get.attitude(player, target) > 0 && target.countCards("he") >= 4) { + return 10; + } + if (get.attitude(player, target) < 0) { + return 5; + } + return -1; + } + }) + .forResult(); + }, + async content(event, trigger, player) { const target = event.targets[0]; - const cards = await player.choosePlayerCard(target, '选择至多3张牌获得', "he", [1, 3],true).set("ai", button=> { - const player = get.player(); - if(ui.selected.buttons?.length) return -1; - if(get.attitude(player,target)>0){ - if(get.position(button.link)=='h') return 5; - return 1; - } - else{ - return 1; - } - }).forResult('cards'); - if(!cards?.length) { event.finish(); return; } + const result = await player + .choosePlayerCard({ + target, + prompt: "选择至多3张牌获得", + selectButton: [1, 3], + position: "he", + forced: true, + ai(button) { + const player = get.player(); + if (ui.selected.buttons?.length) { + return -1; + } + if (get.attitude(player, target) > 0) { + if (get.position(button.link) === "h") { + return 5; + } + return 1; + } else { + return 1; + } + }, + }) + .forResult(); + const cards = result.cards; + if (!cards?.length) { + return; + } const num = cards.length; - player.gain(cards, target, "give"); - const targetsx = game.countPlayer()<=num ? game.filterPlayer() - : await target.chooseTarget(`选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`, true, num).set("ai", target=>{ - if(target==get.player) return 5; - return 1; - }).forResult('targets'); - if (!targetsx?.length) { event.finish(); return; } - player.addSkill('sxrmmieguo_ban'); - player.markAuto('sxrmmieguo_ban',targetsx); + await player.gain({ + cards, + source: target, + animate: "give", + }); + const targetsx = + game.countPlayer() <= num + ? game.filterPlayer() + : ( + await target + .chooseTarget({ + prompt: `选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`, + selectTarget: num, + forced: true, + ai(target) { + if (target === get.player()) { + return 5; + } + return 1; + }, + }) + .forResult() + ).targets; + if (!targetsx?.length) { + return; + } + player.addSkill("sxrmmieguo_ban"); + player.markAuto("sxrmmieguo_ban", targetsx); game.log(player, "执行了一个额外回合"); player.insertPhase(); }, @@ -229,11 +263,13 @@ const skills = { charlotte: true, forced: true, onremove: true, - popup:false, + popup: false, intro: { content(storage) { - if (!storage?.length) return ""; - let list = []; + if (!storage?.length) { + return ""; + } + const list = []; for (let i of storage) { list.push(get.translation(i)); } @@ -241,8 +277,8 @@ const skills = { }, }, mod: { - playerEnabled: function (card, player, target) { - if (player.getStorage('sxrmmieguo_ban')?.includes(target)) { + playerEnabled(card, player, target) { + if (player.getStorage("sxrmmieguo_ban")?.includes(target)) { return false; } }, @@ -250,25 +286,21 @@ const skills = { trigger: { player: "phaseJieshuBegin", }, - filter(event,player){ - return event.getParent('phase').skill == 'sxrmmieguo'; + filter(event, player) { + return event.getParent("phase")?.skill === "sxrmmieguo"; }, - async content(event, trigger, player){ + async content(event, trigger, player) { player.removeSkill(event.name); - if (!player.getHistory("useCard").length) { + if (!player.hasHistory("useCard")) { game.log(player, "【灭虢】使命失败"); player.awakenSkill("sxrmmieguo"); - player.loseMaxHp(); + await player.loseMaxHp(); } }, sub: true, - parentskill: "sxrmmieguo", - "_priority": 0, }, }, - "_priority": 0, }, - //曼巴 //关羽 sxrmhanguo: { diff --git a/apps/core/character/sxrm/temp.js b/apps/core/character/sxrm/temp.js new file mode 100644 index 0000000000..2c8af18cd6 --- /dev/null +++ b/apps/core/character/sxrm/temp.js @@ -0,0 +1,108 @@ +const skills = { + sxrmmieguo: { + audio: 2, + dutySkill: true, + trigger: { + player: "phaseEnd", + }, + filter(event, player) { + return !event.skill; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("sxrmmieguo"), "获得一名其他角色的至多3张牌", function (card, player, target) { + return target != player && target.countCards("he"); + }) + .set("ai", target => { + const player = get.player(); + if (get.attitude(player, target) > 0 && target.countCards("he") >= 4) return 10; + if (get.attitude(player, target) < 0) return 5; + return -1; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const cards = await player + .choosePlayerCard(target, "选择至多3张牌获得", "he", [1, 3], true) + .set("ai", button => { + const player = get.player(); + if (ui.selected.buttons?.length) return -1; + if (get.attitude(player, target) > 0) { + if (get.position(button.link) == "h") return 5; + return 1; + } else { + return 1; + } + }) + .forResult("cards"); + if (!cards?.length) { + event.finish(); + return; + } + const num = cards.length; + player.gain(cards, target, "give"); + const targetsx = + game.countPlayer() <= num + ? game.filterPlayer() + : await target + .chooseTarget(`选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`, true, num) + .set("ai", target => { + if (target == get.player) return 5; + return 1; + }) + .forResult("targets"); + if (!targetsx?.length) { + event.finish(); + return; + } + player.addSkill("sxrmmieguo_ban"); + player.markAuto("sxrmmieguo_ban", targetsx); + game.log(player, "执行了一个额外回合"); + player.insertPhase(); + }, + subSkill: { + ban: { + charlotte: true, + forced: true, + onremove: true, + popup: false, + intro: { + content(storage) { + if (!storage?.length) return ""; + let list = []; + for (let i of storage) { + list.push(get.translation(i)); + } + return "不能对" + list.join("、") + "使用牌"; + }, + }, + mod: { + playerEnabled: function (card, player, target) { + if (player.getStorage("sxrmmieguo_ban")?.includes(target)) { + return false; + } + }, + }, + trigger: { + player: "phaseJieshuBegin", + }, + filter(event, player) { + return event.getParent("phase").skill == "sxrmmieguo"; + }, + async content(event, trigger, player) { + player.removeSkill(event.name); + if (!player.getHistory("useCard").length) { + game.log(player, "【灭虢】使命失败"); + player.awakenSkill("sxrmmieguo"); + player.loseMaxHp(); + } + }, + sub: true, + parentskill: "sxrmmieguo", + _priority: 0, + }, + }, + _priority: 0, + }, +}; diff --git a/apps/core/character/sxrm/translate.js b/apps/core/character/sxrm/translate.js index 3a514da360..deaa145430 100644 --- a/apps/core/character/sxrm/translate.js +++ b/apps/core/character/sxrm/translate.js @@ -108,14 +108,14 @@ const translates = { sxrmqiewang: "怯亡", sxrmqiewang_info: "锁定技,你距离1以内的角色受到伤害后,你摸一张牌,令你的手牌本回合均视为【无懈可击】。", //蚀心入魔·嗔 - sxrm_zhouyu:'魔周瑜', - sxrm_zhouyu_prefix:'魔', + sxrm_zhouyu: "魔周瑜", + sxrm_zhouyu_prefix: "魔", sxrmjiehuo: "劫火", sxrmjiehuo_info: "使命技,回合开始时,你可以令场上下次出现的伤害改为3点火焰伤害。失败:若造成此伤害的角色不为你:你减1点体力上限。", sxrmxianger: "香饵", sxrmxianger_info: "使命技,出牌阶段限一次,你可以令一名角色于其下个结束阶段回复2点体力,期间其不能使用点数大于6的牌。失败:期间其受到的伤害值小于2:你减1点体力上限。", sxrmmieguo: "灭虢", - sxrmmieguo_info:"使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌:你减1点体力上限。", + sxrmmieguo_info: "使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌:你减1点体力上限。", }; export default translates; From 5531d3de273bcf0dc52ac02b25982e9b569873ae Mon Sep 17 00:00:00 2001 From: rintim Date: Sun, 24 May 2026 17:04:39 +0800 Subject: [PATCH 03/12] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E6=B2=A1=E6=B3=A8=E6=84=8F=E5=88=B0=E7=9A=84=E7=BB=86?= =?UTF-8?q?=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/sxrm/skill.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js index 9714a0c93b..df80d8f29b 100644 --- a/apps/core/character/sxrm/skill.js +++ b/apps/core/character/sxrm/skill.js @@ -159,9 +159,13 @@ const skills = { order: 10, result: { target(player, target) { - if (player.hasSkill("sxrmxianger_limit") || get.attitude(player, target) > 0 || player == target || !player.storage.sxrmjiehuo_mark) return 0; + if (player.hasSkill("sxrmxianger_limit") || get.attitude(player, target) > 0 || player === target || !player.storage.sxrmjiehuo_mark) { + return 0; + } let val = get.damageEffect(target, player, player); - if (player.inRange(target)) val++; + if (player.inRange(target)) { + val++; + } return -val; }, }, From 44388f8d6ea6f7a569790a731106ca410a8cdf42 Mon Sep 17 00:00:00 2001 From: ycyutian <2414374457@qq.com> Date: Fri, 29 May 2026 00:23:13 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E5=AD=99=E5=B0=9A=E9=A6=99=E3=80=81?= =?UTF-8?q?=E5=BC=A0=E6=98=AD=E3=80=81=E5=A5=91=E5=AE=9A=E6=8A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/sxrm/character.js | 12 + apps/core/character/sxrm/characterTitle.js | 2 + apps/core/character/sxrm/dynamicTranslate.js | 19 + apps/core/character/sxrm/skill.js | 402 +++++++++++++++++++ apps/core/character/sxrm/sort.js | 2 +- apps/core/character/sxrm/translate.js | 14 + apps/core/noname/get/index.js | 9 + apps/core/noname/get/is.js | 13 + apps/core/noname/library/element/player.js | 9 + apps/core/noname/library/index.js | 7 + apps/core/noname/library/poptip.js | 1 + apps/core/vite.config.ts | 2 +- 12 files changed, 490 insertions(+), 2 deletions(-) diff --git a/apps/core/character/sxrm/character.js b/apps/core/character/sxrm/character.js index 9a0871818d..bbac14f73f 100644 --- a/apps/core/character/sxrm/character.js +++ b/apps/core/character/sxrm/character.js @@ -9,6 +9,18 @@ const characters = { skills:["sxrmjiehuo","sxrmxianger","sxrmmieguo"], groupInGuozhan: "wu", }, + sxrm_sunshangxiang:{ + sex:"female", + group:"wu", + hp:3, + skills:["sxrmjiaozong","sxrmfusui"], + }, + sxrm_zhangzhao:{ + sex:"male", + group:"wu", + hp:3, + skills:["sxrmxiezhong","sxrmqishi"], + }, //慢 sxrm_guanyu: { sex: "male", diff --git a/apps/core/character/sxrm/characterTitle.js b/apps/core/character/sxrm/characterTitle.js index a5085bbf78..f3650fc387 100644 --- a/apps/core/character/sxrm/characterTitle.js +++ b/apps/core/character/sxrm/characterTitle.js @@ -1,5 +1,7 @@ export default { sxrm_zhouyu:"哀弦万耳惊", + sxrm_sunshangxiang:"生死相随", + sxrm_zhangzhao:"迂儒", sxrm_guanyu: "四海仰鼻息", sxrm_guanyinping: "天骄虎女", diff --git a/apps/core/character/sxrm/dynamicTranslate.js b/apps/core/character/sxrm/dynamicTranslate.js index 27b4498d84..a4018a3f80 100644 --- a/apps/core/character/sxrm/dynamicTranslate.js +++ b/apps/core/character/sxrm/dynamicTranslate.js @@ -1,6 +1,25 @@ import { lib, game, ui, get, ai, _status } from "noname"; const dynamicTranslates = { + sxrmqishi(player, skill) { + const bool = player.getStorage(skill, false); + let type = !bool ? get.poptip("sxrm_qidingSkill") : '锁定技'; + let forced = !bool ? '可以' : ''; + return `${type}。结束阶段,你${forced}获得本回合其他角色进入弃牌堆的至多五张牌,然后你跳过下个摸牌阶段。`; + }, + sxrmbiyi(player, skill){ + const bool = player.getStorage(skill, false); + let sk = player.storage.sxrmfusui_skill; + let yang = sk ? `【${get.translation(sk)}】` : '无技能', + yin = '【枭姬】'; + if (bool) { + yin = `${yin}`; + } else { + yang = `${yang}`; + } + let start = '转换技,你视为拥有:', end = '。当你发动上述对应技能后,切换本技能状态。'; + return `${start}阳:${yang};阴:${yin}${end}`; + }, sxrmcongfeng(player, skill) { const bool = player.getStorage(skill, false); let yang = "与使用者各摸一张牌", diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js index e99787e892..01087e3e6d 100644 --- a/apps/core/character/sxrm/skill.js +++ b/apps/core/character/sxrm/skill.js @@ -268,6 +268,408 @@ const skills = { }, "_priority": 0, }, + //嗔孙尚香 + sxrmjiaozong: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + target: "useCardToTargeted", + }, + filter(event, player) { + if (event.name != "phaseZhunbei" && event.card.name != "sha") return false; + return player.canMoveCard(null, true); + }, + async cost(event,trigger,player){ + event.result = await player.chooseTarget(get.prompt2("sxrmjiaozong"),(card,player,target)=>{ + return target.getCards('e').some(e=>{ + return game.hasPlayer(current=>{ + return current!=target && current.canEquip(e); + }) + }) + }).set("ai", target=>{ + const player = get.player(); + let val = Math.sign(get.attitude(player, target)); + if (val > 0){ + if(target.hasSkill('xiaoji')) val+=4; + if(game.hasPlayer(current=>{ + return get.attitude(player,current)<0 && target.getCards('e').some(e=>{ + return get.color(e)=='red' && current.canEquip(e) && player.inRange(current) && _status.currentPhase==player; + }) + })) val+=5; + } + else{ + if(game.hasPlayer(current=>{ + return get.attitude(player,current)>0 && target.getCards('e').some(e=>current.canEquip(e)) && current!=player; + })) val = (-val)+3; + } + return val; + }).forResult(); + }, + async content(event,trigger,player) { + const target = event.targets[0]; + let result = await player.choosePlayerCard( target,'e', true).set("ai", button=>{ + const from = get.event('from'), player = get.player(); + let val = get.value(button.link, from); + if (get.attitude(player, from) < 0) return 5 - val; + return val; + }).set('from',target).forResult(); + const card = result.links[0]; + result = await player.chooseTarget("将" + get.translation(card) + "移动至一名角色的装备区",true, (card0, player, target0)=>{ + return target0.canEquip(card) && target0 != target; + }).set("ai", target=>{ + const player = get.player(), card0 = get.event('card0'); + let val = Math.sign(get.attitude(player, target)); + if(val<0){ + if(player.inRange(target) && player==_status.currentPhase) val = (-val)+get.color(card0)=='red'?3:2; + else if(target==_status.currentPhase) val = (-val)+4; + else val = -val; + } + else{ + if(target==player && player==_status.currentPhase) val-=5; + if(target.hasSkillTag('nodamage')) val+=5; + else val+=1; + } + return val; + }).set('card0',card).forResult(); + const target2 = result.targets[0]; + player.line(target); + target.$give(card, target2); + target2.equip(card); + const color = get.color(card); + target2.addTempSkill('sxrmjiaozong_ban'); + target2.markAuto('sxrmjiaozong_ban',color); + }, + subSkill: { + ban: { + charlotte: true, + intro: { + content:(storage, player)=>{ + let str = ''; + if(storage?.length) str = "本回合不能使用" + storage.map(i=>get.translation(i)).join('、') + "牌"; + str += '且受到的伤害+1'; + return str; + }, + }, + forced:true, + onremove:true, + popup:false, + mod: { + cardEnabled: function (card, player) { + if (player.getStorage('sxrmjiaozong_ban')?.includes(get.color(card))) return false; + }, + cardSavable: function (card, player) { + if (player.getStorage('sxrmjiaozong_ban')?.includes(get.color(card))) return false; + }, + }, + trigger:{player:'damageBegin3'}, + content() { + trigger.num++; + }, + sub: true, + parentskill: "sxrmjiaozong", + "_priority": 0, + }, + }, + "_priority": 0, + }, + sxrmfusui: { + audio: 2, + enable: "phaseUse", + limited: true, + derivation: 'sxrmbiyi', + filterTarget(card, player, target) { + let skills = target.getSkills(null,false,false).filter(skill=>{ + let list = get.skillCategoriesOf(skill, player); + return !list.length; + }); + return target != player && target.sex == "male" && skills.length; + }, + async content(event,trigger,player){ + const target = event.targets[0]; + player.awakenSkill("sxrmfusui"); + let skills = target.getSkills(null,false,false).filter(skill=>{ + let list = get.skillCategoriesOf(skill, player); + return !list.length; + }); + if (!skills.length) { + event.finish(); return; + } + const skill = await player.chooseControl(skills).set("prompt", "令" + get.translation(target) + "失去一个技能").forResult('control'); + if(!skill) { + event.finish(); return; + } + target.removeSkill(skill); + for(let i of [player,target]){ + i.storage.sxrmfusui_skill = skill; + i.addSkill("sxrmbiyi"); + i.addTempSkill("sxrmfusui_prevent", { player: "roundStart" }); + } + }, + ai: { + order: 7, + result: { + target: 2, + }, + }, + subSkill: { + prevent: { + trigger: { + player: "damageBegin4", + }, + forced: true, + charlotte: true, + content() { + trigger.cancel(); + }, + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target: function (card, player, target, current) { + if (get.tag(card, "damage")) return [0, 0]; + }, + }, + }, + }, + }, + }, + sxrmbiyi: { + audio: 2, + zhuanhuanji: true, + mark: true, + marktext: "☯", + derivation:'xiaoji', + forced: true, + locked: false, + init(player, skill) { + let lostSkill = player.storage.sxrmfusui_skill; + if (lostSkill) { + player.addAdditionalSkill(skill, [lostSkill]); + } + }, + intro: { + content (storage, player) { + if (!storage) { + let lostSkill = player.storage.sxrmfusui_skill; + if (lostSkill) return "当前状态:阳(" + get.translation(lostSkill) + ")"; + return "当前状态:阳(无技能)"; + } + else return "当前状态:阴(枭姬)"; + } + }, + trigger: { + player: ["useSkill", "logSkillBegin"], + }, + filter(event, player) { + const skill = event.skill || event.sourceSkill; + if (!skill) return false; + let currentSkill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : 'xiaoji'; + if (!currentSkill) return false; + let info = get.info(skill); + if(info && info.charlotte) return false; + console.log(skill); console.log(currentSkill) + return skill == currentSkill; + }, + content() { + player.changeZhuanhuanji("sxrmbiyi"); + player.removeAdditionalSkill("sxrmbiyi"); + let skill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : 'xiaoji'; + if (skill) { + player.addAdditionalSkill("sxrmbiyi", [skill]); + } + }, + onremove: function (player) { + player.removeAdditionalSkill("sxrmbiyi"); + delete player.storage.sxrmfusui_skill; + }, + }, + //嗔张昭 + sxrmxiezhong: { + audio: 2, + trigger: { + player: "phaseZhunbeiBegin", + }, + filter(event, player) { + return game.countPlayer() > 1; + }, + async cost(event,trigger,player){ + let num = Math.ceil(game.countPlayer() / 2); + event.result = await player.chooseTarget(get.prompt2('sxrmxiezhong'), num).set('ai',(target)=>{ + const player = get.player(); + let val; + if(get.attitude(player,target)>0){ + val = 3; + if(target.countCards('h')<=3 && target.hp<=3) val = -1; + else if(target.hp>=5) val = 5; + } + else{ + val = 2; + if(target.countCards('h')<=3 && target.hp<=3) val = 4; + else if(target.countCards('h')>=6 || target.hp>=5) val = -1; + } + return val; + }).forResult(); + }, + async content(event,trigger,player){ + let targets = event.targets.slice().sortBySeat(), targetsx = targets; + if(!targets?.length) {event.finish(); return;} + let list = []; + while(targets.length){ + let target = targets.shift(); + if(!target.isIn()) continue; + if(!lib.skill.sxrmxiezhong.canUseSha(target)) list.push([target,0]); + else{ + let result = await target.chooseControl('摸两张牌并失去1点体力', '将两张牌当【杀】使用').set('prompt','请选择一项').set('ai', ()=>{ + const player = get.player(); + if(player.hp <=2) return 1; + if(player.countCards('he') <=3) return 0; + return player.getUseValue(get.autoViewAs({name:'sha',isCard:true}))>1 ? 1 : 0; + }).forResult(); + list.push([target,result.index]); + } + } + if(!list.length) {event.finish(); return;} + let count2 = list.reduce((acc,cur)=>{ + cur[0].popup(cur[1]==0 ? '摸牌' : '出杀'); + return acc+=cur[1]; + },0); + let count1 = list.length - count2; + while(list.length){ + let item = list.shift(), target = item[0], num = item[1]; + if(!target.isIn()) continue; + if(num==0){ + target.draw(2); + target.loseHp(); + } + else{ + if(!lib.skill.sxrmxiezhong.canUseSha(target)) continue; + const cards = await target.chooseCard('he', 2, true, '请选择两张牌当【杀】使用').set('ai', function (card) { + return 5 - get.value(card); + }).forResult('cards'); + if(!cards.length) continue; + await target.chooseUseTarget({name:'sha'},cards,true,false); + } + } + if(count1 == count2 || !game.hasPlayer(target=>!targets.includes(target))) {event.finish(); return;} + let num = count1>count2 ? 0 : 1; + let result0 = await player.chooseTarget(`选择一名角色,令其执行两次“${num==0?'摸两张牌并失去一点体力':'将两张牌当【杀】使用'}”的选项`,(card,player,target)=>!targetsx.includes(target),true).set('ai',(target)=>{ + const player = get.player(); + let att = get.attitude(player,target), num = get.event('num'), val; + if(att>0){ + val = 1; + if(target.hp>=6 && num==0) val = 3; + if(target.countCards('he')==1 && num==1) val = 6; + } + else{ + val = 2; + if(target.hp<=1 && num==0) val = 5; + else if(target.countCards('he')<=4 && target.countCards('he')>1 && num==1) val = 4; + if(target.countCards('he')==1 && num==1) val = 0.5; + } + return val; + }).set('num',num).forResult(); + const target = result0.targets[0]; + player.line(target); + for (let i = 0; i < 2; i++) { + if(num == 0){ + target.draw(2); + target.loseHp(); + } + else{ + if(!lib.skill.sxrmxiezhong.canUseSha(target)) continue; + const cards = await target.chooseCard('he', 2, true, '请选择两张牌当【杀】使用').set('ai', function (card) { + return 5 - get.value(card); + }).forResult('cards'); + if(!cards.length) continue; + await target.chooseUseTarget({name:'sha'},cards,true,false); + } + } + }, + canUseSha(player){ + let cards = player.getCards('he'); + if(cards.length<2) return false; + return cards.some(card1=>{ + return cards.some(card2=>{ + if(card1 == card2) return false; + let card0 = get.autoViewAs({name:'sha'},[card1,card2]); + return lib.filter.cardEnabled(card0,player); + }) + }); + }, + "_priority": 0, + }, + sxrmqishi: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + locked(skill, player) { + if (!player || !player.storage.sxrmqishi) return false; + return true; + }, + qidingSkill(skill, player) { + if (!player || !player.storage.sxrmqishi) return true; + return false; + }, + getZhongyangCards(player){ + let cards = []; + game.checkGlobalHistory("cardMove", evt => { + if (evt.name == 'lose' && evt.player!=player && evt.position === ui.discardPile) { + cards.addArray(evt.cards); + } + else if (evt.name == "cardsDiscard") { + for(let i of game.filterPlayer()){ + if(i!=player) cards.addArray(evt.getd(i,'cards2')); + } + } + }) + cards = cards.filterInD('d').flat().unique(); + if(!cards.length) cards = []; + return cards; + }, + filter(event, player) { + return lib.skill.sxrmqishi.getZhongyangCards(player).length; + }, + async cost(event,trigger,player){ + let forced = Boolean(player.storage.sxrmqishi); + let cards = lib.skill.sxrmqishi.getZhongyangCards(player); + let result = await player.chooseButton(['获得本回合其他角色进入弃牌堆的至多五张牌',cards],[1,5],forced).set('ai',(button)=>{ + const cards = get.event('cards'); + if(cards.length < 4) return -1; + return get.value(button.link); + }).set('cards',cards).forResult(); + event.result = { + bool:result.bool, + cost_data:result.links + }; + }, + async content(event,trigger,player) { + player.awakenQidingSkill(event.name); + const cards = event.cost_data; + player.gain(cards,'gain2'); + player.skip("phaseDraw"); + player.addTempSkill(event.name + "_mark", { player: "phaseDrawSkipped" }); + }, + mark:true, + intro: { + content: "qidingSkill", + }, + subSkill:{ + mark: { + charlotte: true, + mark: true, + marktext: '饿', + intro: { + content: "跳过下个摸牌阶段", + }, + sub: true, + sourceSkill: "sxrmqishi", + "_priority": 0, + } + }, + "_priority": 0, + }, //曼巴 //关羽 diff --git a/apps/core/character/sxrm/sort.js b/apps/core/character/sxrm/sort.js index 4f85bf94c0..73eab273ca 100644 --- a/apps/core/character/sxrm/sort.js +++ b/apps/core/character/sxrm/sort.js @@ -1,7 +1,7 @@ const characterSort = { shixinrumo_yi: ["sxrm_caocao", "sxrm_liubei", "sxrm_jianggan", "sxrm_huatuo", "sxrm_lvboshe", "sxrm_fuhuanghou", "sxrm_xunyu", "sxrm_caopi", "sxrm_wanghou"], shixinrumo_man: ["sxrm_guanyu", "sxrm_guanyinping", "sxrm_yujin", "sxrm_mifang", "sxrm_liufeng", "sxrm_luxun", "sxrm_lvmeng", "sxrm_pangde", "sxrm_yanwen"], - shixinrumo_chen: ["sxrm_zhouyu"], + shixinrumo_chen: ["sxrm_zhouyu","sxrm_sunshangxiang","sxrm_zhangzhao"], }; const characterSortTranslate = { diff --git a/apps/core/character/sxrm/translate.js b/apps/core/character/sxrm/translate.js index 3a514da360..d5a6a65e37 100644 --- a/apps/core/character/sxrm/translate.js +++ b/apps/core/character/sxrm/translate.js @@ -116,6 +116,20 @@ const translates = { sxrmxianger_info: "使命技,出牌阶段限一次,你可以令一名角色于其下个结束阶段回复2点体力,期间其不能使用点数大于6的牌。失败:期间其受到的伤害值小于2:你减1点体力上限。", sxrmmieguo: "灭虢", sxrmmieguo_info:"使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌:你减1点体力上限。", + sxrm_sunshangxiang:"嗔孙尚香", + sxrm_sunshangxiang_prefix:"嗔", + sxrmjiaozong: "骄纵", + sxrmjiaozong_info: "准备阶段或当你成为【杀】的目标后,你可以移动场上一张装备牌至一名角色装备区内,其本回合不能使用与之颜色相同的牌且受到的伤害+1。", + sxrmfusui: "妇随", + sxrmfusui_info: "限定技,出牌阶段,你可以选择一名其他男性角色的一个非标签技能,你令其失去此技能,然后你与其获得“比翼”并防止你们本轮受到的伤害。", + sxrmbiyi: "比翼", + sxrmbiyi_info: "转换技,你视为拥有:阳:因【妇随】失去的技能;阴:【枭姬】。当你发动上述对应技能后,切换本技能状态。", + sxrm_zhangzhao: "嗔张昭", + sxrm_zhangzhao_prefix:"嗔", + sxrmxiezhong: "挟众", + sxrmxiezhong_info: "准备阶段,你可令场上半数角色(向上取整)依次选择并执行一项:1.摸两张牌,失去 1 点体力;2.将两张牌当【杀】使用。然后你可以令另一名角色执行两次被选择较多的一项。", + sxrmqishi: "乞施", + sxrmqishi_info: `${get.poptip("sxrm_qidingSkill")}。结束阶段,你可以获得本回合其他角色进入弃牌堆的至多五张牌,然后你跳过下个摸牌阶段。`, }; export default translates; diff --git a/apps/core/noname/get/index.js b/apps/core/noname/get/index.js index b1adcac97f..98d158a981 100644 --- a/apps/core/noname/get/index.js +++ b/apps/core/noname/get/index.js @@ -835,6 +835,9 @@ export class Get { if (info.feedPigSkill) { list.add("威主技"); } + if (get.is.qidingSkill(skill, player)) { + list.add("契定技"); + } if (info.categories) { list.addArray(info.categories(skill, player)); } @@ -4905,6 +4908,12 @@ else if (entry[1] !== void 0) stringifying[key] = JSON.stringify(entry[1]);*/ } return "未发动"; } + case "qidingSkill": { + if (content) { + return "此事已成"; + } + return "契约未定"; + } case "info": { return lib.translate[skill + "_info"]; } diff --git a/apps/core/noname/get/is.js b/apps/core/noname/get/is.js index 1bff529911..5d71aeb697 100644 --- a/apps/core/noname/get/is.js +++ b/apps/core/noname/get/is.js @@ -642,6 +642,19 @@ export class Is { return Boolean(zhuanhuanji); } + /** + * @param { string } skill + * @param { Player } player + * @returns + */ + qidingSkill(skill, player) { + const info = get.info(skill), { qidingSkill } = info; + if(typeof(qidingSkill) === "function") { + return Boolean(qidingSkill(skill, player)); + } + return Boolean(qidingSkill); + } + /** * 检查指定玩家的名称的子串是否包含指定字符串 * diff --git a/apps/core/noname/library/element/player.js b/apps/core/noname/library/element/player.js index eb8a79e755..c63fc42ad5 100644 --- a/apps/core/noname/library/element/player.js +++ b/apps/core/noname/library/element/player.js @@ -11463,6 +11463,15 @@ export class Player extends HTMLDivElement { _status.event.clearStepCache(); return this; } + awakenQidingSkill(skill){ + if (this.storage[skill]) return; + if (this.storage[skill] === undefined || this.storage[skill] === false) { + this.storage[skill] = true; + } + game.log(`契约已成,${get.translation(this)}将【${get.translation(skill)}】改为锁定技。`); + _status.event.clearStepCache(); + return this; + } restoreSkill(skill, nomark) { if (this.storage[skill] === true) { this.storage[skill] = false; diff --git a/apps/core/noname/library/index.js b/apps/core/noname/library/index.js index 3c55b51deb..e6c25c4141 100644 --- a/apps/core/noname/library/index.js +++ b/apps/core/noname/library/index.js @@ -13713,6 +13713,13 @@ export class Library { nature: "graymm", }, ], + [ + "嗔", + { + color: "#5a6968", + nature: "graymm", + }, + ], [ "用间", { diff --git a/apps/core/noname/library/poptip.js b/apps/core/noname/library/poptip.js index 36d1f4747a..31b71c8392 100644 --- a/apps/core/noname/library/poptip.js +++ b/apps/core/noname/library/poptip.js @@ -30,6 +30,7 @@ const _poptipMap = new Map([ ["rule_tongxin", { name: "同心", info: "若技能拥有同心效果,则拥有该技能的角色可在回合开始时与其他角色同心直到自己下回合开始(默认为选择一名角色同心),选择的角色称为“同心角色”。拥有同心效果的技能发动后,技能发动者先执行同心效果。然后若有与其同心的角色,这些角色也依次执行同心效果。" }], ["sxrm_connect", {name: "连接", info: `一种对手牌的动作:
  • 被连接的手牌对所有角色可见
  • 一名角色因为使用、打出、弃置而失去连接牌时,所有角色依次弃置被连接的手牌(不可嵌套)
  • 一张连接牌再次被连接或离开手牌区时,重置为正常状态`}], ["sxrm_compare", { name: "延时拼点", info: "拼点的子类,拼点结束后不会立刻公布结果,改为将两张拼点牌扣置并移出游戏;满足一定条件时公开结果,此回合结束后,若仍未满足公开条件,将游戏外的拼点牌移回弃牌堆,并且不再执行拼点的后续效果。" }], + ["sxrm_qidingSkill", { name: "契定技", info: "一种技能标签。发动一次后,此技能“契定技”的标签改为“锁定技”并删除技能描述中的“可以”。"}], ["rule_mamba", { name: "牢大", info: "Man! What can I say? Mamba out!" }], ]); diff --git a/apps/core/vite.config.ts b/apps/core/vite.config.ts index 898f5adafe..0102e5af9f 100644 --- a/apps/core/vite.config.ts +++ b/apps/core/vite.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; const port = { - client: 8080, + client: 8088, server: 8089, }; From a989f407f136970eb5ccede2fa56bbba9f6f6bb7 Mon Sep 17 00:00:00 2001 From: rintim Date: Fri, 29 May 2026 16:14:13 +0800 Subject: [PATCH 05/12] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=97=A7=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/sxrm/character.js | 22 +- apps/core/character/sxrm/characterTitle.js | 6 +- apps/core/character/sxrm/dynamicTranslate.js | 13 +- apps/core/character/sxrm/skill.js | 722 ++++++++++--------- apps/core/character/sxrm/sort.js | 2 +- apps/core/character/sxrm/translate.js | 8 +- apps/core/noname/get/is.js | 8 +- apps/core/noname/library/element/player.js | 4 +- apps/core/noname/library/poptip.js | 4 +- 9 files changed, 431 insertions(+), 358 deletions(-) diff --git a/apps/core/character/sxrm/character.js b/apps/core/character/sxrm/character.js index d3221a6fbe..9cdab7b671 100644 --- a/apps/core/character/sxrm/character.js +++ b/apps/core/character/sxrm/character.js @@ -7,17 +7,17 @@ const characters = { skills: ["sxrmjiehuo", "sxrmxianger", "sxrmmieguo"], groupInGuozhan: "wu", }, - sxrm_sunshangxiang:{ - sex:"female", - group:"wu", - hp:3, - skills:["sxrmjiaozong","sxrmfusui"], - }, - sxrm_zhangzhao:{ - sex:"male", - group:"wu", - hp:3, - skills:["sxrmxiezhong","sxrmqishi"], + sxrm_sunshangxiang: { + sex: "female", + group: "wu", + hp: 3, + skills: ["sxrmjiaozong", "sxrmfusui"], + }, + sxrm_zhangzhao: { + sex: "male", + group: "wu", + hp: 3, + skills: ["sxrmxiezhong", "sxrmqishi"], }, //慢 sxrm_guanyu: { diff --git a/apps/core/character/sxrm/characterTitle.js b/apps/core/character/sxrm/characterTitle.js index f3650fc387..5a7507b7cc 100644 --- a/apps/core/character/sxrm/characterTitle.js +++ b/apps/core/character/sxrm/characterTitle.js @@ -1,7 +1,7 @@ export default { - sxrm_zhouyu:"哀弦万耳惊", - sxrm_sunshangxiang:"生死相随", - sxrm_zhangzhao:"迂儒", + sxrm_zhouyu: "哀弦万耳惊", + sxrm_sunshangxiang: "生死相随", + sxrm_zhangzhao: "迂儒", sxrm_guanyu: "四海仰鼻息", sxrm_guanyinping: "天骄虎女", diff --git a/apps/core/character/sxrm/dynamicTranslate.js b/apps/core/character/sxrm/dynamicTranslate.js index a4018a3f80..a591458db7 100644 --- a/apps/core/character/sxrm/dynamicTranslate.js +++ b/apps/core/character/sxrm/dynamicTranslate.js @@ -3,21 +3,22 @@ import { lib, game, ui, get, ai, _status } from "noname"; const dynamicTranslates = { sxrmqishi(player, skill) { const bool = player.getStorage(skill, false); - let type = !bool ? get.poptip("sxrm_qidingSkill") : '锁定技'; - let forced = !bool ? '可以' : ''; + let type = !bool ? get.poptip("sxrm_qidingSkill") : "锁定技"; + let forced = !bool ? "可以" : ""; return `${type}。结束阶段,你${forced}获得本回合其他角色进入弃牌堆的至多五张牌,然后你跳过下个摸牌阶段。`; }, - sxrmbiyi(player, skill){ + sxrmbiyi(player, skill) { const bool = player.getStorage(skill, false); let sk = player.storage.sxrmfusui_skill; - let yang = sk ? `【${get.translation(sk)}】` : '无技能', - yin = '【枭姬】'; + let yang = sk ? `【${get.translation(sk)}】` : "无技能", + yin = "【枭姬】"; if (bool) { yin = `${yin}`; } else { yang = `${yang}`; } - let start = '转换技,你视为拥有:', end = '。当你发动上述对应技能后,切换本技能状态。'; + let start = "转换技,你视为拥有:", + end = "。当你发动上述对应技能后,切换本技能状态。"; return `${start}阳:${yang};阴:${yin}${end}`; }, sxrmcongfeng(player, skill) { diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js index feef8929bd..c63ddb9307 100644 --- a/apps/core/character/sxrm/skill.js +++ b/apps/core/character/sxrm/skill.js @@ -315,9 +315,6 @@ const skills = { await player.loseMaxHp(); } }, - sub: true, - parentskill: "sxrmmieguo", - "_priority": 0, }, }, }, @@ -329,237 +326,179 @@ const skills = { target: "useCardToTargeted", }, filter(event, player) { - if (event.name != "phaseZhunbei" && event.card.name != "sha") return false; + if (event.name !== "phaseZhunbei" && event.card.name !== "sha") { + return false; + } return player.canMoveCard(null, true); }, - async cost(event,trigger,player){ - event.result = await player.chooseTarget(get.prompt2("sxrmjiaozong"),(card,player,target)=>{ - return target.getCards('e').some(e=>{ - return game.hasPlayer(current=>{ - return current!=target && current.canEquip(e); - }) - }) - }).set("ai", target=>{ - const player = get.player(); - let val = Math.sign(get.attitude(player, target)); - if (val > 0){ - if(target.hasSkill('xiaoji')) val+=4; - if(game.hasPlayer(current=>{ - return get.attitude(player,current)<0 && target.getCards('e').some(e=>{ - return get.color(e)=='red' && current.canEquip(e) && player.inRange(current) && _status.currentPhase==player; - }) - })) val+=5; - } - else{ - if(game.hasPlayer(current=>{ - return get.attitude(player,current)>0 && target.getCards('e').some(e=>current.canEquip(e)) && current!=player; - })) val = (-val)+3; - } - return val; - }).forResult(); - }, - async content(event,trigger,player) { - const target = event.targets[0]; - let result = await player.choosePlayerCard( target,'e', true).set("ai", button=>{ - const from = get.event('from'), player = get.player(); - let val = get.value(button.link, from); - if (get.attitude(player, from) < 0) return 5 - val; - return val; - }).set('from',target).forResult(); - const card = result.links[0]; - result = await player.chooseTarget("将" + get.translation(card) + "移动至一名角色的装备区",true, (card0, player, target0)=>{ - return target0.canEquip(card) && target0 != target; - }).set("ai", target=>{ - const player = get.player(), card0 = get.event('card0'); - let val = Math.sign(get.attitude(player, target)); - if(val<0){ - if(player.inRange(target) && player==_status.currentPhase) val = (-val)+get.color(card0)=='red'?3:2; - else if(target==_status.currentPhase) val = (-val)+4; - else val = -val; - } - else{ - if(target==player && player==_status.currentPhase) val-=5; - if(target.hasSkillTag('nodamage')) val+=5; - else val+=1; - } - return val; - }).set('card0',card).forResult(); - const target2 = result.targets[0]; - player.line(target); - target.$give(card, target2); - target2.equip(card); - const color = get.color(card); - target2.addTempSkill('sxrmjiaozong_ban'); - target2.markAuto('sxrmjiaozong_ban',color); - }, - subSkill: { - ban: { - charlotte: true, - intro: { - content:(storage, player)=>{ - let str = ''; - if(storage?.length) str = "本回合不能使用" + storage.map(i=>get.translation(i)).join('、') + "牌"; - str += '且受到的伤害+1'; - return str; - }, - }, - forced:true, - onremove:true, - popup:false, - mod: { - cardEnabled: function (card, player) { - if (player.getStorage('sxrmjiaozong_ban')?.includes(get.color(card))) return false; + async cost(event, trigger, player) { + event.result = await player + .chooseTarget({ + prompt: get.prompt2("sxrmjiaozong"), + filterTarget(card, player, target) { + return target.hasCards("e", card => game.hasPlayer(current => current !== target && current.canEquip(card))); }, - cardSavable: function (card, player) { - if (player.getStorage('sxrmjiaozong_ban')?.includes(get.color(card))) return false; + ai(target) { + const player = get.player(); + let val = Math.sign(get.attitude(player, target)); + if (val > 0) { + if (target.hasSkill("xiaoji")) { + val += 4; + } + if (game.hasPlayer(current => get.attitude(player, current) < 0 && target.hasCards("e", card => get.color(card) === "red" && current.canEquip(card) && player.inRange(current) && _status.currentPhase === player))) { + val += 5; + } + } else { + if (game.hasPlayer(current => get.attitude(player, current) > 0 && target.hasCards("e", card => current.canEquip(card)) && current !== player)) { + val = -val + 3; + } + } + return val; }, - }, - trigger:{player:'damageBegin3'}, - content() { - trigger.num++; - }, - sub: true, - parentskill: "sxrmjiaozong", - "_priority": 0, - }, - }, - "_priority": 0, - }, - //嗔孙尚香 - sxrmjiaozong: { - audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - target: "useCardToTargeted", - }, - filter(event, player) { - if (event.name != "phaseZhunbei" && event.card.name != "sha") return false; - return player.canMoveCard(null, true); - }, - async cost(event,trigger,player){ - event.result = await player.chooseTarget(get.prompt2("sxrmjiaozong"),(card,player,target)=>{ - return target.getCards('e').some(e=>{ - return game.hasPlayer(current=>{ - return current!=target && current.canEquip(e); - }) }) - }).set("ai", target=>{ - const player = get.player(); - let val = Math.sign(get.attitude(player, target)); - if (val > 0){ - if(target.hasSkill('xiaoji')) val+=4; - if(game.hasPlayer(current=>{ - return get.attitude(player,current)<0 && target.getCards('e').some(e=>{ - return get.color(e)=='red' && current.canEquip(e) && player.inRange(current) && _status.currentPhase==player; - }) - })) val+=5; - } - else{ - if(game.hasPlayer(current=>{ - return get.attitude(player,current)>0 && target.getCards('e').some(e=>current.canEquip(e)) && current!=player; - })) val = (-val)+3; - } - return val; - }).forResult(); + .forResult(); }, - async content(event,trigger,player) { + async content(event, trigger, player) { const target = event.targets[0]; - let result = await player.choosePlayerCard( target,'e', true).set("ai", button=>{ - const from = get.event('from'), player = get.player(); - let val = get.value(button.link, from); - if (get.attitude(player, from) < 0) return 5 - val; - return val; - }).set('from',target).forResult(); + let result = await player + .choosePlayerCard({ + target, + position: "e", + forced: true, + ai(button) { + const event = get.event(); + const from = event.from; + const player = get.player(); + let val = get.value(button.link, from); + if (get.attitude(player, from) < 0) { + return 5 - val; + } + return val; + }, + }) + .set("from", target) + .forResult(); + if (!result.links?.length) { + return; + } const card = result.links[0]; - result = await player.chooseTarget("将" + get.translation(card) + "移动至一名角色的装备区",true, (card0, player, target0)=>{ - return target0.canEquip(card) && target0 != target; - }).set("ai", target=>{ - const player = get.player(), card0 = get.event('card0'); - let val = Math.sign(get.attitude(player, target)); - if(val<0){ - if(player.inRange(target) && player==_status.currentPhase) val = (-val)+get.color(card0)=='red'?3:2; - else if(target==_status.currentPhase) val = (-val)+4; - else val = -val; - } - else{ - if(target==player && player==_status.currentPhase) val-=5; - if(target.hasSkillTag('nodamage')) val+=5; - else val+=1; - } - return val; - }).set('card0',card).forResult(); + result = await player + .chooseTarget({ + prompt: `将${get.translation(card)}移动至一名角色的装备区`, + filterTarget(card, player, target) { + const { card0 } = get.event(); + return target.canEquip(card0) && target !== target; + }, + forced: true, + }) + .set("ai", target => { + const player = get.player(); + const { card0 } = get.event(); + let val = Math.sign(get.attitude(player, target)); + if (val < 0) { + if (player.inRange(target) && player == _status.currentPhase) { + val = -val + get.color(card0) == "red" ? 3 : 2; + } else if (target == _status.currentPhase) { + val = -val + 4; + } else { + val = -val; + } + } else { + if (target == player && player == _status.currentPhase) { + val -= 5; + } + if (target.hasSkillTag("nodamage")) { + val += 5; + } else { + val += 1; + } + } + return val; + }) + .set("card0", card) + .forResult(); + if (!result.targets?.length) { + return; + } const target2 = result.targets[0]; player.line(target); target.$give(card, target2); - target2.equip(card); + await target2.equip(card); const color = get.color(card); - target2.addTempSkill('sxrmjiaozong_ban'); - target2.markAuto('sxrmjiaozong_ban',color); + target2.addTempSkill("sxrmjiaozong_ban"); + target2.markAuto("sxrmjiaozong_ban", color); }, subSkill: { ban: { charlotte: true, intro: { - content:(storage, player)=>{ - let str = ''; - if(storage?.length) str = "本回合不能使用" + storage.map(i=>get.translation(i)).join('、') + "牌"; - str += '且受到的伤害+1'; + content(storage, player) { + let str = ""; + if (storage?.length) { + str = "本回合不能使用" + storage.map(i => get.translation(i)).join("、") + "牌"; + } + str += "且受到的伤害+1"; return str; }, }, - forced:true, - onremove:true, - popup:false, + forced: true, + onremove: true, + popup: false, mod: { - cardEnabled: function (card, player) { - if (player.getStorage('sxrmjiaozong_ban')?.includes(get.color(card))) return false; + cardEnabled(card, player) { + if (player.getStorage("sxrmjiaozong_ban")?.includes(get.color(card))) { + return false; + } }, - cardSavable: function (card, player) { - if (player.getStorage('sxrmjiaozong_ban')?.includes(get.color(card))) return false; + cardSavable(card, player) { + if (player.getStorage("sxrmjiaozong_ban")?.includes(get.color(card))) { + return false; + } }, }, - trigger:{player:'damageBegin3'}, - content() { + trigger: { player: "damageBegin3" }, + async content(event, trigger, player) { trigger.num++; }, - sub: true, - parentskill: "sxrmjiaozong", - "_priority": 0, }, }, - "_priority": 0, }, sxrmfusui: { audio: 2, enable: "phaseUse", limited: true, - derivation: 'sxrmbiyi', + derivation: "sxrmbiyi", filterTarget(card, player, target) { - let skills = target.getSkills(null,false,false).filter(skill=>{ - let list = get.skillCategoriesOf(skill, player); + const skills = target.getSkills(null, false, false).filter(skill => { + const list = get.skillCategoriesOf(skill, player); return !list.length; }); - return target != player && target.sex == "male" && skills.length; + return target !== player && target.sex === "male" && skills.length > 0; }, - async content(event,trigger,player){ + async content(event, trigger, player) { const target = event.targets[0]; player.awakenSkill("sxrmfusui"); - let skills = target.getSkills(null,false,false).filter(skill=>{ + const skills = target.getSkills(null, false, false).filter(skill => { let list = get.skillCategoriesOf(skill, player); return !list.length; }); if (!skills.length) { - event.finish(); return; + return; } - const skill = await player.chooseControl(skills).set("prompt", "令" + get.translation(target) + "失去一个技能").forResult('control'); - if(!skill) { - event.finish(); return; + const { control: skill } = await player + .chooseControl({ + prompt: `令${get.translation(target)}失去一个技能`, + controls: skills, + }) + .forResult(); + if (!skill) { + return; } target.removeSkill(skill); - for(let i of [player,target]){ - i.storage.sxrmfusui_skill = skill; - i.addSkill("sxrmbiyi"); - i.addTempSkill("sxrmfusui_prevent", { player: "roundStart" }); + for (const current of [player, target]) { + current.storage.sxrmfusui_skill = skill; + current.addSkill("sxrmbiyi"); + current.addTempSkill("sxrmfusui_prevent", { player: "roundStart" }); } }, ai: { @@ -575,7 +514,7 @@ const skills = { }, forced: true, charlotte: true, - content() { + async content(event, trigger, player) { trigger.cancel(); }, ai: { @@ -583,8 +522,10 @@ const skills = { nothunder: true, nodamage: true, effect: { - target: function (card, player, target, current) { - if (get.tag(card, "damage")) return [0, 0]; + target(card, player, target, current) { + if (get.tag(card, "damage")) { + return [0, 0]; + } }, }, }, @@ -596,7 +537,7 @@ const skills = { zhuanhuanji: true, mark: true, marktext: "☯", - derivation:'xiaoji', + derivation: "xiaoji", forced: true, locked: false, init(player, skill) { @@ -606,37 +547,47 @@ const skills = { } }, intro: { - content (storage, player) { + content(storage, player) { if (!storage) { let lostSkill = player.storage.sxrmfusui_skill; - if (lostSkill) return "当前状态:阳(" + get.translation(lostSkill) + ")"; + if (lostSkill) { + return "当前状态:阳(" + get.translation(lostSkill) + ")"; + } return "当前状态:阳(无技能)"; + } else { + return "当前状态:阴(枭姬)"; } - else return "当前状态:阴(枭姬)"; - } + }, }, trigger: { player: ["useSkill", "logSkillBegin"], }, filter(event, player) { const skill = event.skill || event.sourceSkill; - if (!skill) return false; - let currentSkill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : 'xiaoji'; - if (!currentSkill) return false; + if (!skill) { + return false; + } + let currentSkill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : "xiaoji"; + if (!currentSkill) { + return false; + } let info = get.info(skill); - if(info && info.charlotte) return false; - console.log(skill); console.log(currentSkill) + if (info && info.charlotte) { + return false; + } + console.log(skill); + console.log(currentSkill); return skill == currentSkill; }, - content() { + async content(event, trigger, player) { player.changeZhuanhuanji("sxrmbiyi"); player.removeAdditionalSkill("sxrmbiyi"); - let skill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : 'xiaoji'; + const skill = !player.storage["sxrmbiyi"] ? player.storage.sxrmfusui_skill : "xiaoji"; if (skill) { player.addAdditionalSkill("sxrmbiyi", [skill]); } }, - onremove: function (player) { + onremove(player) { player.removeAdditionalSkill("sxrmbiyi"); delete player.storage.sxrmfusui_skill; }, @@ -650,111 +601,208 @@ const skills = { filter(event, player) { return game.countPlayer() > 1; }, - async cost(event,trigger,player){ - let num = Math.ceil(game.countPlayer() / 2); - event.result = await player.chooseTarget(get.prompt2('sxrmxiezhong'), num).set('ai',(target)=>{ - const player = get.player(); - let val; - if(get.attitude(player,target)>0){ - val = 3; - if(target.countCards('h')<=3 && target.hp<=3) val = -1; - else if(target.hp>=5) val = 5; - } - else{ - val = 2; - if(target.countCards('h')<=3 && target.hp<=3) val = 4; - else if(target.countCards('h')>=6 || target.hp>=5) val = -1; - } - return val; - }).forResult(); - }, - async content(event,trigger,player){ - let targets = event.targets.slice().sortBySeat(), targetsx = targets; - if(!targets?.length) {event.finish(); return;} - let list = []; - while(targets.length){ - let target = targets.shift(); - if(!target.isIn()) continue; - if(!lib.skill.sxrmxiezhong.canUseSha(target)) list.push([target,0]); - else{ - let result = await target.chooseControl('摸两张牌并失去1点体力', '将两张牌当【杀】使用').set('prompt','请选择一项').set('ai', ()=>{ + async cost(event, trigger, player) { + const num = Math.ceil(game.countPlayer() / 2); + event.result = await player + .chooseTarget({ + prompt: get.prompt2("sxrmxiezhong"), + selectTarget: num, + ai(target) { const player = get.player(); - if(player.hp <=2) return 1; - if(player.countCards('he') <=3) return 0; - return player.getUseValue(get.autoViewAs({name:'sha',isCard:true}))>1 ? 1 : 0; - }).forResult(); - list.push([target,result.index]); - } + let val; + if (get.attitude(player, target) > 0) { + val = 3; + if (target.countCards("h") <= 3 && target.hp <= 3) { + val = -1; + } else if (target.hp >= 5) { + val = 5; + } + } else { + val = 2; + if (target.countCards("h") <= 3 && target.hp <= 3) { + val = 4; + } else if (target.countCards("h") >= 6 || target.hp >= 5) { + val = -1; + } + } + return val; + }, + }) + .forResult(); + }, + async content(event, trigger, player) { + const targets = event.targets.sortBySeat(); + if (!targets?.length) { + return; } - if(!list.length) {event.finish(); return;} - let count2 = list.reduce((acc,cur)=>{ - cur[0].popup(cur[1]==0 ? '摸牌' : '出杀'); - return acc+=cur[1]; - },0); - let count1 = list.length - count2; - while(list.length){ - let item = list.shift(), target = item[0], num = item[1]; - if(!target.isIn()) continue; - if(num==0){ - target.draw(2); - target.loseHp(); + /** @type { [Player, number][]} */ + let list = []; + for (const target of targets) { + if (!target.isIn()) { + continue; } - else{ - if(!lib.skill.sxrmxiezhong.canUseSha(target)) continue; - const cards = await target.chooseCard('he', 2, true, '请选择两张牌当【杀】使用').set('ai', function (card) { - return 5 - get.value(card); - }).forResult('cards'); - if(!cards.length) continue; - await target.chooseUseTarget({name:'sha'},cards,true,false); + if (!lib.skill.sxrmxiezhong.canUseSha(target)) { + list.push([target, 0]); + } else { + let result = await target + .chooseControl({ + prompt: "请选择一项", + controls: ["摸两张牌并失去1点体力", "将两张牌当【杀】使用"], + ai() { + const player = get.player(); + if (player.hp <= 2) { + return 1; + } + if (player.countCards("he") <= 3) { + return 0; + } + return player.getUseValue(get.autoViewAs({ name: "sha", isCard: true })) > 1 ? 1 : 0; + }, + }) + .forResult(); + if (result.index == null) { + continue; + } + list.push([target, result.index]); } } - if(count1 == count2 || !game.hasPlayer(target=>!targets.includes(target))) {event.finish(); return;} - let num = count1>count2 ? 0 : 1; - let result0 = await player.chooseTarget(`选择一名角色,令其执行两次“${num==0?'摸两张牌并失去一点体力':'将两张牌当【杀】使用'}”的选项`,(card,player,target)=>!targetsx.includes(target),true).set('ai',(target)=>{ - const player = get.player(); - let att = get.attitude(player,target), num = get.event('num'), val; - if(att>0){ - val = 1; - if(target.hp>=6 && num==0) val = 3; - if(target.countCards('he')==1 && num==1) val = 6; + if (!list.length) { + return; + } + let count2 = 0; + for (const [current, index] of list) { + current.popup(index === 0 ? "摸牌" : "出杀"); + count2 += index; + } + const count1 = list.length - count2; + for (const [target, index] of list) { + if (!target.isIn()) { + continue; } - else{ - val = 2; - if(target.hp<=1 && num==0) val = 5; - else if(target.countCards('he')<=4 && target.countCards('he')>1 && num==1) val = 4; - if(target.countCards('he')==1 && num==1) val = 0.5; + if (index == 0) { + await target.draw(2); + await target.loseHp(); + } else { + if (!lib.skill.sxrmxiezhong.canUseSha(target)) { + continue; + } + const result = await target + .chooseCard({ + prompt: "请选择两张牌当【杀】使用", + selectCard: 2, + position: "he", + forced: true, + ai(card) { + return 5 - get.value(card); + }, + }) + .forResult(); + const cards = result.cards; + if (!cards?.length) { + continue; + } + await target.chooseUseTarget({ + card: get.autoViewAs({ name: "sha" }), + cards, + forced: true, + addCount: false, + }); } - return val; - }).set('num',num).forResult(); - const target = result0.targets[0]; + } + if (count1 === count2 || !game.hasPlayer(target => !targets.includes(target))) { + return; + } + const num = count1 > count2 ? 0 : 1; + const result = await player + .chooseTarget({ + prompt: `选择一名角色,令其执行两次“${num == 0 ? "摸两张牌并失去一点体力" : "将两张牌当【杀】使用"}”的选项`, + filterTarget(card, player, target) { + const { targets } = get.event(); + return !targets.includes(target); + }, + forced: true, + ai(target) { + const player = get.player(); + const att = get.attitude(player, target); + const { num } = get.event(); + let val; + if (att > 0) { + val = 1; + if (target.hp >= 6 && num === 0) { + val = 3; + } + if (target.countCards("he") === 1 && num === 1) { + val = 6; + } + } else { + val = 2; + if (target.hp <= 1 && num === 0) { + val = 5; + } else if (target.countCards("he") <= 4 && target.countCards("he") > 1 && num === 1) { + val = 4; + } + if (target.countCards("he") === 1 && num === 1) { + val = 0.5; + } + } + return val; + }, + }) + .set("num", num) + .set("targets", targets) + .forResult(); + if (!result.targets?.length) { + return; + } + const target = result.targets[0]; player.line(target); for (let i = 0; i < 2; i++) { - if(num == 0){ - target.draw(2); - target.loseHp(); - } - else{ - if(!lib.skill.sxrmxiezhong.canUseSha(target)) continue; - const cards = await target.chooseCard('he', 2, true, '请选择两张牌当【杀】使用').set('ai', function (card) { - return 5 - get.value(card); - }).forResult('cards'); - if(!cards.length) continue; - await target.chooseUseTarget({name:'sha'},cards,true,false); + if (num == 0) { + await target.draw(2); + await target.loseHp(); + } else { + if (!lib.skill.sxrmxiezhong.canUseSha(target)) { + continue; + } + const result = await target + .chooseCard({ + prompt: "请选择两张牌当【杀】使用", + selectCard: 2, + position: "he", + forced: true, + ai(card) { + return 5 - get.value(card); + }, + }) + .forResult(); + const cards = result.cards; + if (!cards?.length) { + continue; + } + await target.chooseUseTarget({ + card: get.autoViewAs({ name: "sha" }), + cards, + forced: true, + addCount: false, + }); } } }, - canUseSha(player){ - let cards = player.getCards('he'); - if(cards.length<2) return false; - return cards.some(card1=>{ - return cards.some(card2=>{ - if(card1 == card2) return false; - let card0 = get.autoViewAs({name:'sha'},[card1,card2]); - return lib.filter.cardEnabled(card0,player); - }) + canUseSha(player) { + let cards = player.getCards("he"); + if (cards.length < 2) { + return false; + } + return cards.some(card1 => { + return cards.some(card2 => { + if (card1 === card2) { + return false; + } + const card0 = get.autoViewAs({ name: "sha" }, [card1, card2]); + return lib.filter.cardEnabled(card0, player); + }); }); }, - "_priority": 0, }, sxrmqishi: { audio: 2, @@ -762,72 +810,90 @@ const skills = { player: "phaseJieshuBegin", }, locked(skill, player) { - if (!player || !player.storage.sxrmqishi) return false; + if (!player?.storage.sxrmqishi) { + return false; + } return true; }, qidingSkill(skill, player) { - if (!player || !player.storage.sxrmqishi) return true; + if (!player?.storage.sxrmqishi) { + return true; + } return false; }, - getZhongyangCards(player){ + getZhongyangCards(player) { let cards = []; game.checkGlobalHistory("cardMove", evt => { - if (evt.name == 'lose' && evt.player!=player && evt.position === ui.discardPile) { + if (evt.name == "lose" && evt.player != player && evt.position === ui.discardPile) { cards.addArray(evt.cards); - } - else if (evt.name == "cardsDiscard") { - for(let i of game.filterPlayer()){ - if(i!=player) cards.addArray(evt.getd(i,'cards2')); + } else if (evt.name == "cardsDiscard") { + for (const current of game.filterPlayer()) { + if (current != player) { + cards.addArray(evt.getd(current, "cards2")); + } } } - }) - cards = cards.filterInD('d').flat().unique(); - if(!cards.length) cards = []; + }); + cards = cards.filterInD("d").flat().unique(); + if (!cards.length) { + cards = []; + } return cards; }, filter(event, player) { return lib.skill.sxrmqishi.getZhongyangCards(player).length; }, - async cost(event,trigger,player){ - let forced = Boolean(player.storage.sxrmqishi); - let cards = lib.skill.sxrmqishi.getZhongyangCards(player); - let result = await player.chooseButton(['获得本回合其他角色进入弃牌堆的至多五张牌',cards],[1,5],forced).set('ai',(button)=>{ - const cards = get.event('cards'); - if(cards.length < 4) return -1; - return get.value(button.link); - }).set('cards',cards).forResult(); + async cost(event, trigger, player) { + const forced = Boolean(player.storage.sxrmqishi); + const cards = lib.skill.sxrmqishi.getZhongyangCards(player); + const result = await player + .chooseButton({ + createDialog: ["获得本回合其他角色进入弃牌堆的至多五张牌", cards], + selectButton: [1, 5], + forced, + ai(button) { + const { cards } = get.event(); + if (cards.length < 4) { + return -1; + } + return get.value(button.link); + }, + }) + .set("cards", cards) + .forResult(); event.result = { - bool:result.bool, - cost_data:result.links + bool: result.bool, + cost_data: { + links: result.links, + }, }; }, - async content(event,trigger,player) { + async content(event, trigger, player) { player.awakenQidingSkill(event.name); - const cards = event.cost_data; - player.gain(cards,'gain2'); + const cards = event.cost_data.links; + player.gain({ + cards, + animate: "gain2", + }); player.skip("phaseDraw"); player.addTempSkill(event.name + "_mark", { player: "phaseDrawSkipped" }); }, - mark:true, + mark: true, intro: { content: "qidingSkill", }, - subSkill:{ + subSkill: { mark: { charlotte: true, mark: true, - marktext: '饿', + marktext: "饿", intro: { content: "跳过下个摸牌阶段", }, - sub: true, - sourceSkill: "sxrmqishi", - "_priority": 0, - } + }, }, - "_priority": 0, }, - + //曼巴 //关羽 sxrmhanguo: { diff --git a/apps/core/character/sxrm/sort.js b/apps/core/character/sxrm/sort.js index 73eab273ca..57709dde4c 100644 --- a/apps/core/character/sxrm/sort.js +++ b/apps/core/character/sxrm/sort.js @@ -1,7 +1,7 @@ const characterSort = { shixinrumo_yi: ["sxrm_caocao", "sxrm_liubei", "sxrm_jianggan", "sxrm_huatuo", "sxrm_lvboshe", "sxrm_fuhuanghou", "sxrm_xunyu", "sxrm_caopi", "sxrm_wanghou"], shixinrumo_man: ["sxrm_guanyu", "sxrm_guanyinping", "sxrm_yujin", "sxrm_mifang", "sxrm_liufeng", "sxrm_luxun", "sxrm_lvmeng", "sxrm_pangde", "sxrm_yanwen"], - shixinrumo_chen: ["sxrm_zhouyu","sxrm_sunshangxiang","sxrm_zhangzhao"], + shixinrumo_chen: ["sxrm_zhouyu", "sxrm_sunshangxiang", "sxrm_zhangzhao"], }; const characterSortTranslate = { diff --git a/apps/core/character/sxrm/translate.js b/apps/core/character/sxrm/translate.js index ecfa0b505f..6ab9cbdc06 100644 --- a/apps/core/character/sxrm/translate.js +++ b/apps/core/character/sxrm/translate.js @@ -115,9 +115,9 @@ const translates = { sxrmxianger: "香饵", sxrmxianger_info: "使命技,出牌阶段限一次,你可以令一名角色于其下个结束阶段回复2点体力,期间其不能使用点数大于6的牌。失败:期间其受到的伤害值小于2:你减1点体力上限。", sxrmmieguo: "灭虢", - sxrmmieguo_info:"使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌:你减1点体力上限。", - sxrm_sunshangxiang:"嗔孙尚香", - sxrm_sunshangxiang_prefix:"嗔", + sxrmmieguo_info: "使命技,额定回合结束后,你可以获得一名其他角色至多三张牌并令其指定等量角色,然后你执行一个不能对其指定角色使用牌的额外回合;失败:此回合你未使用过牌:你减1点体力上限。", + sxrm_sunshangxiang: "嗔孙尚香", + sxrm_sunshangxiang_prefix: "嗔", sxrmjiaozong: "骄纵", sxrmjiaozong_info: "准备阶段或当你成为【杀】的目标后,你可以移动场上一张装备牌至一名角色装备区内,其本回合不能使用与之颜色相同的牌且受到的伤害+1。", sxrmfusui: "妇随", @@ -125,7 +125,7 @@ const translates = { sxrmbiyi: "比翼", sxrmbiyi_info: "转换技,你视为拥有:阳:因【妇随】失去的技能;阴:【枭姬】。当你发动上述对应技能后,切换本技能状态。", sxrm_zhangzhao: "嗔张昭", - sxrm_zhangzhao_prefix:"嗔", + sxrm_zhangzhao_prefix: "嗔", sxrmxiezhong: "挟众", sxrmxiezhong_info: "准备阶段,你可令场上半数角色(向上取整)依次选择并执行一项:1.摸两张牌,失去 1 点体力;2.将两张牌当【杀】使用。然后你可以令另一名角色执行两次被选择较多的一项。", sxrmqishi: "乞施", diff --git a/apps/core/noname/get/is.js b/apps/core/noname/get/is.js index 5d71aeb697..1d49f46704 100644 --- a/apps/core/noname/get/is.js +++ b/apps/core/noname/get/is.js @@ -648,8 +648,12 @@ export class Is { * @returns */ qidingSkill(skill, player) { - const info = get.info(skill), { qidingSkill } = info; - if(typeof(qidingSkill) === "function") { + const info = get.info(skill); + if (!info) { + return false; + } + const { qidingSkill } = info; + if (typeof qidingSkill === "function") { return Boolean(qidingSkill(skill, player)); } return Boolean(qidingSkill); diff --git a/apps/core/noname/library/element/player.js b/apps/core/noname/library/element/player.js index c63fc42ad5..48802bcc84 100644 --- a/apps/core/noname/library/element/player.js +++ b/apps/core/noname/library/element/player.js @@ -11464,7 +11464,9 @@ export class Player extends HTMLDivElement { return this; } awakenQidingSkill(skill){ - if (this.storage[skill]) return; + if (this.storage[skill]) { + return; + } if (this.storage[skill] === undefined || this.storage[skill] === false) { this.storage[skill] = true; } diff --git a/apps/core/noname/library/poptip.js b/apps/core/noname/library/poptip.js index 31b71c8392..8ada17f638 100644 --- a/apps/core/noname/library/poptip.js +++ b/apps/core/noname/library/poptip.js @@ -28,9 +28,9 @@ const _poptipMap = new Map([ ["rule_jiang", { name: "激昂", info: "一名角色发动“昂扬技”标签技能后,此技能失效,直至从此刻至满足此技能“激昂”条件后。" }], ["rule_lizhan", { name: "历战", info: "一名角色的回合结束时,若本回合发动过拥有历战效果的技能,则对此技能效果的进行等同于发动次数的永久可叠加式升级或修改。" }], ["rule_tongxin", { name: "同心", info: "若技能拥有同心效果,则拥有该技能的角色可在回合开始时与其他角色同心直到自己下回合开始(默认为选择一名角色同心),选择的角色称为“同心角色”。拥有同心效果的技能发动后,技能发动者先执行同心效果。然后若有与其同心的角色,这些角色也依次执行同心效果。" }], - ["sxrm_connect", {name: "连接", info: `一种对手牌的动作:
  • 被连接的手牌对所有角色可见
  • 一名角色因为使用、打出、弃置而失去连接牌时,所有角色依次弃置被连接的手牌(不可嵌套)
  • 一张连接牌再次被连接或离开手牌区时,重置为正常状态`}], + ["sxrm_connect", { name: "连接", info: `一种对手牌的动作:
  • 被连接的手牌对所有角色可见
  • 一名角色因为使用、打出、弃置而失去连接牌时,所有角色依次弃置被连接的手牌(不可嵌套)
  • 一张连接牌再次被连接或离开手牌区时,重置为正常状态` }], ["sxrm_compare", { name: "延时拼点", info: "拼点的子类,拼点结束后不会立刻公布结果,改为将两张拼点牌扣置并移出游戏;满足一定条件时公开结果,此回合结束后,若仍未满足公开条件,将游戏外的拼点牌移回弃牌堆,并且不再执行拼点的后续效果。" }], - ["sxrm_qidingSkill", { name: "契定技", info: "一种技能标签。发动一次后,此技能“契定技”的标签改为“锁定技”并删除技能描述中的“可以”。"}], + ["sxrm_qidingSkill", { name: "契定技", info: "一种技能标签。发动一次后,此技能“契定技”的标签改为“锁定技”并删除技能描述中的“可以”。" }], ["rule_mamba", { name: "牢大", info: "Man! What can I say? Mamba out!" }], ]); From cc94961ed5741406d4fc4f417c7d6775717453b1 Mon Sep 17 00:00:00 2001 From: ycyutian <2414374457@qq.com> Date: Sat, 6 Jun 2026 18:37:55 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=97=94=E5=8C=85?= =?UTF-8?q?=E5=89=A9=E4=BD=99=E6=AD=A6=E5=B0=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/sxrm/character.js | 38 + apps/core/character/sxrm/characterTitle.js | 6 + apps/core/character/sxrm/dynamicTranslate.js | 6 + apps/core/character/sxrm/intro.js | 2 + apps/core/character/sxrm/skill.js | 1076 ++++++++++++++++-- apps/core/character/sxrm/sort.js | 2 +- apps/core/character/sxrm/translate.js | 33 + 7 files changed, 1063 insertions(+), 100 deletions(-) diff --git a/apps/core/character/sxrm/character.js b/apps/core/character/sxrm/character.js index 9cdab7b671..fe0a902b3c 100644 --- a/apps/core/character/sxrm/character.js +++ b/apps/core/character/sxrm/character.js @@ -19,6 +19,44 @@ const characters = { hp: 3, skills: ["sxrmxiezhong", "sxrmqishi"], }, + sxrm_lusu: { + sex: "male", + group: "wu", + hp: 3, + skills: ["sxrmwanli", "sxrmlishui"], + }, + sxrm_chen_caocao: { + sex: "male", + group: "wei", + hp: 4, + skills: ["sxrmlanjiao"], + }, + sxrm_zhugeliang: { + sex: "male", + group: "shu", + hp: 3, + skills: ["sxrmbingqu", "sxrmfanxin"], + groupBorder: "shen", + names: "诸葛|亮", + }, + sxrm_jiahua: { + sex: "male", + group: "wu", + hp: 5, + skills: ["sxrmfubei", "sxrmdancui"], + }, + sxrm_zhaoyun: { + sex: "male", + group: "shu", + hp: 4, + skills: ["sxrmzhaduo"], + }, + sxrm_caoren: { + sex: "male", + group: "wei", + hp: 4, + skills: ["sxrmyangbei", "sxrmyinfeng"], + }, //慢 sxrm_guanyu: { sex: "male", diff --git a/apps/core/character/sxrm/characterTitle.js b/apps/core/character/sxrm/characterTitle.js index 5a7507b7cc..f37b6cb012 100644 --- a/apps/core/character/sxrm/characterTitle.js +++ b/apps/core/character/sxrm/characterTitle.js @@ -2,6 +2,12 @@ export default { sxrm_zhouyu: "哀弦万耳惊", sxrm_sunshangxiang: "生死相随", sxrm_zhangzhao: "迂儒", + sxrm_lusu: "养虫成蛇", + sxrm_chen_caocao: "铜雀囚凰", + sxrm_zhugeliang: "人也神也", + sxrm_jiahua: "拔剑四顾", + sxrm_zhaoyun: "坐收渔利", + sxrm_caoren: "坚壳之蚌", sxrm_guanyu: "四海仰鼻息", sxrm_guanyinping: "天骄虎女", diff --git a/apps/core/character/sxrm/dynamicTranslate.js b/apps/core/character/sxrm/dynamicTranslate.js index a591458db7..e7a12346f1 100644 --- a/apps/core/character/sxrm/dynamicTranslate.js +++ b/apps/core/character/sxrm/dynamicTranslate.js @@ -1,6 +1,12 @@ import { lib, game, ui, get, ai, _status } from "noname"; const dynamicTranslates = { + sxrmdancui(player, skill) { + const bool = player.getStorage(skill, false); + let type = !bool ? get.poptip("sxrm_qidingSkill") : "锁定技"; + let forced = !bool ? "可以" : "须"; + return `${type}。当你造成伤害时,你${forced}弃置两张牌(无牌则不弃,不足则全弃),令此伤害+1。`; + }, sxrmqishi(player, skill) { const bool = player.getStorage(skill, false); let type = !bool ? get.poptip("sxrm_qidingSkill") : "锁定技"; diff --git a/apps/core/character/sxrm/intro.js b/apps/core/character/sxrm/intro.js index ea837540f1..69ef2a8891 100644 --- a/apps/core/character/sxrm/intro.js +++ b/apps/core/character/sxrm/intro.js @@ -2,6 +2,8 @@ const characterIntro = { sxrm_wanghou: "王垕是罗贯中创作的小说《三国演义》及其衍生作品中的角色,于小说第十七回登场,为曹操征讨袁术时管粮官任峻部下仓官,后被曹操冤杀。人名不见于正史记载,事件原型源于《三国志》裴松之注引的《曹瞒传》。", sxrm_caocao: " “将军,魏王邀你去回忆中一叙。” 
    “眼见未必为真,请务必保持清醒。”", sxrm_guanyu: " “曹孟德,重逢之期指日可待。” 
    “彼时当与君共话此途之宵小————君亦居此。”", + sxrm_zhouyu: " “恨其诈,恨其黠,恨其狡,恨其奸,” 
    “恨其...不为吾所用。”", + sxrm_jiahua: "贾华,小说《三国演义》中的虚构人物,吴国大帝孙权部将,在京剧《甘露寺》中写作贾化。该角色初次登场于小说第五十三回,持方天画戟与宋谦共同护卫孙权攻打合肥,交战中兵器被乐进斩断;后奉命率三百刀斧手埋伏于甘露寺长廊,欲在吴国太不满刘备时擒杀之,后此计被识破,在民间衍生出“甘露寺的伏兵——假话(贾华)”的谚语。" }; export default characterIntro; diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js index c63ddb9307..d7a525ec8e 100644 --- a/apps/core/character/sxrm/skill.js +++ b/apps/core/character/sxrm/skill.js @@ -253,20 +253,20 @@ const skills = { game.countPlayer() <= num ? game.filterPlayer() : ( - await target - .chooseTarget({ - prompt: `选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`, - selectTarget: num, - forced: true, - ai(target) { - if (target === get.player()) { - return 5; - } - return 1; - }, - }) - .forResult() - ).targets; + await target + .chooseTarget({ + prompt: `选择${num}名角色,${get.translation(player)}的额外回合内无法对这些角色使用牌`, + selectTarget: num, + forced: true, + ai(target) { + if (target === get.player()) { + return 5; + } + return 1; + }, + }) + .forResult() + ).targets; if (!targetsx?.length) { return; } @@ -893,6 +893,884 @@ const skills = { }, }, }, + //嗔鲁肃 + sxrmwanli: { + audio: 2, + trigger: { + global: "roundStart", + }, + filter(event, player) { + return game.roundNumber == 1 && !player.getStorage("sxrmwanli")?.length && game.countPlayer() > 1; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget({ + prompt: "选择放出高利贷的目标", + filterTarget: lib.filter.notMe, + ai: target => { + return -get.attitude(get.player(), target); + } + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const cards = await player + .chooseCard({ + position: 'he', + selectCard: [1, Infinity], + prompt: '请选择交给' + get.translation(target) + '的牌', + forced: true, + ai: card => { + if (!ui.selected.cards?.length) return 10 - get.value(card); + return -1; + } + }) + .forResult('cards'); + await player.give(cards, target); + let name = event.name + '_eff'; + player.addSkill(name); + player.markAuto(name, [{ + target: target, + cards: 3 * cards.length, + round: 4, + huanqian: false, + }]); + }, + group: ['sxrmwanli_draw'], + subSkill: { + eff: { + forced: true, + charlotte: true, + trigger: { + global: "roundEnd", + }, + filter(event, player) { + return game.hasPlayer(current => { + return player.getStorage('sxrmwanli_eff')?.some(item => { + return item.target == current && current.isIn() && !item.huanqian && game.roundNumber >= item.round; + }); + }); + }, + async content(event, trigger, player) { + let items = player.getStorage('sxrmwanli_eff') + .filter(item => { + return item.target.isIn() && !item.huanqian && game.roundNumber <= item.round; + }); + const targets = items.map(item => item.target).sortBySeat(); + items = items.sort((x, y) => x.indexOf(targets) - y.indexOf(targets)); + for (let i in items) { + const { target, cards: num } = items[i]; + if (!target.isIn()) continue; + let loseSkill, cards; + if (target.countCards('he') <= num) { + cards = target.getCards('he'); + if (target.countCards('he') < num) loseSkill = true; + } + else { + cards = await target + .chooseCard({ + prompt: `选择${get.cnNumber(num)}张牌还给${get.translation(player)}`, + forced: true, + position: 'he', + ai: card => { + return 10 - get.value(card); + } + }) + .forResult('cards'); + } + target.line(player); + if (cards?.length) await target.give(cards, player); + if (loseSkill) target.clearSkills(); + for (let j in player.storage['sxrmwanli_eff']) { + if (player.storage['sxrmwanli_eff'][j].target == target) { + player.storage['sxrmwanli_eff'][j].huanqian = true; + } + } + } + }, + intro: { + content(storage) { + if (!storage) return '账单是空的?!'; + let str = ''; + for (let item of storage) { + let { target, cards: num, round, huanqian } = item; + let str1 = `${get.translation(target)}需于第${round}轮结束时还给你${num}张牌`; + if (huanqian || !target.isAlive()) { + str1 = `${str1}`; + if (huanqian) str1 += '(已还钱)'; + else str1 += '(已死亡)'; + } + str1 = `
  • ${str1}
    `; + str += str1; + } + return str; + } + }, + sub: true, + parentskill: "sxrmwanli", + }, + draw: { + forced: true, + locked: false, + trigger: { + player: "phaseDrawBegin", + }, + filter(event, player) { + if (!player.getStorage('sxrmwanli_eff')?.length) return false; + let num = player.getStorage('sxrmwanli_eff').reduce((sum, item) => { + const { target, huanqian } = item; + sum += (!target.isAlive() || huanqian) ? 3 : 0; + return sum; + }, 0); + return num > 0; + }, + async content(event, trigger, player) { + let num = player.getStorage('sxrmwanli_eff').reduce((sum, item) => { + const { target, huanqian } = item; + sum += (!target.isAlive() || huanqian) ? 3 : 0; + return sum; + }, 0); + trigger.num += num; + }, + sub: true, + parentskill: "sxrmwanli", + }, + }, + }, + sxrmlishui: { + audio: 2, + trigger: { + target: "useCardToTarget", + }, + filter(event, player) { + return get.color(event.card) == 'black'; + }, + async content(event, trigger, player) { + await player.draw(); + if (!player.getStorage('sxrmwanli_eff')?.length) { + return; + } + let targets = []; + player.getStorage('sxrmwanli_eff').forEach(item => { + const { target, huanqian } = item; + if (!huanqian && target.isIn() && player.canCompare(target)) + targets.push(target); + }); + if (!targets.length) { + return; + } + const result = await player + .chooseTarget({ + prompt: '选择一名“万利”角色拼点', + filterTarget: (card, player, target) => { + return targets.includes(target); + }, + forced: true, + }). + forResult(); + const target = result.targets[0]; + const result2 = await player.chooseToCompare(target).forResult(); + if (!player.storage['sxrmwanli_eff']) { + return; + } + if (result2.winner == player) { + player.say('还钱!'); + for (const i in player.storage['sxrmwanli_eff']) { + if (player.storage['sxrmwanli_eff'][i].target == target) { + let num = player.storage['sxrmwanli_eff'][i]['round']; + player.storage['sxrmwanli_eff'][i]['round'] = Math.max(game.roundNumber, num - 1); + } + } + game.log(target, '的“万利”还钱时间被提前一轮'); + } + }, + ai: { + effect: { + target(card, player, target, current) { + if (get.color(card) == 'black' && get.attitude(target, player) < 0) { + return [1, 0.2]; + } + }, + }, + }, + }, + //嗔曹操 + sxrmlanjiao: { + audio: 2, + enable: "phaseUse", + filterTarget(card, player, target) { + return target != player && !player.getStorage("sxrmlanjiao_used")?.targets?.includes(target) && target.countCards("h") >= 2; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + let cards; + while (1) { + if (!target.isIn() || target.countCards("h") < 2) { + break; + } + cards = await player + .choosePlayerCard({ + target, + position: "h", + selectButton: 2 + }) + .forResult("cards"); + await player.showCards(cards, `${get.translation(player)}对${get.translation(target)}发动了【揽娇】`); + let rechoose = await target + .chooseBool({ + prompt: `是否失去一点体力并摸一张牌,令${get.translation(player)}重新选择?`, + ai: () => { + const player = get.player(), cards = get.event("cards"); + return player.hp > 3 && !cards.some(i => get.color(i) == "red"); + } + }) + .set("cards", cards) + .forResult("bool"); + if (rechoose) { + await target.draw(); + await target.loseHp(); + } + else { + break; + } + } + if (!cards?.length || !target.isIn()) { + return; + } + player.gain(cards, target, "give"); + player.addTempSkill("sxrmlanjiao_used"); + if (!player.storage["sxrmlanjiao_used"]) { + player.storage["sxrmlanjiao_used"] = { + targets: [], + suits: [], + }; + } + player.storage["sxrmlanjiao_used"].targets.add(target); + cards.forEach(i => { + player.storage["sxrmlanjiao_used"].suits.add(get.suit(i)); + }); + let suits = player.storage["sxrmlanjiao_used"].suits; + if (suits.includes("heart") && suits.includes("diamond")) { + player.tempBanSkill(event.name); + } + }, + ai: { + order: 8, + result: { + target: -1, + }, + }, + subSkill: { + used: { + charlotte: true, + mark: true, + intro: { + content(storage, player) { + if (!storage) return ""; + let { targets, suits } = storage; + let str1 = targets.map(i => get.translation(i)).join("、"), + str2 = suits.map(i => get.translation(i)).join("、"); + return `本回合已指定过的目标:${str1}
    本回合获得过的花色:${str2}`; + } + }, + sub: true, + sourceSkill: "sxrmlanjiao", + } + }, + }, + //嗔诸葛亮 + sxrmbingqu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return game.countPlayer() > 1; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget({ + prompt: "是否与一名其他角色各声明一种普通锦囊牌?", + filter: lib.filter.notMe, + ai: (target) => { + const player = get.player(); + if (player.countCards("h") > 4) { + return -1; + } + const att = get.attitude(player, target); + if (att) { + return target.countCards("h") <= 4 ? 1 : -1; + } + else return target.countCards("h") > 4 ? 1 : -1; + }, + }) + .forResult(); + }, + getVcards(player) { + let list = lib.inpile.filter(name => { + return get.type(name) == 'trick'; + }); + let vcard = list + .filter(name => { + return lib.filter.cardEnabled({ name: name }, player); + }) + .map(namex => { + let name = Array.isArray(namex) ? namex.name : namex; + return [get.type(name), "", name]; + }); + return vcard; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + let vcard1 = lib.skill["sxrmbingqu"].getVcards(target); + let vcard2 = lib.skill["sxrmbingqu"].getVcards(player); + let targetCard = {}; + for (let i of [[player, target, vcard1], [target, player, vcard2]]){ + const [playerx, targetx, vcard] = i; + if (!vcard?.length || !playerx.isIn()) { + continue; + } + const result = await playerx + .chooseButton({ + createDialog: [ + `为${get.translation(targetx)}选择一个锦囊牌名`, + [vcard, "vcard"] + ], + forced: true, + ai: (button) => { + const player = get.player(), target = get.event("target"); + return get.effect(player, { name: button.link[2] }, target, player); + } + }) + .set("target", targetx) + .forResult(); + const name = result.links[0][2] + game.log(playerx, "声明了", get.translation(name)); + targetCard[targetx.playerid] = name; + } + for (let playerx of [player, target]){ + if (!playerx.isIn()) continue; + if (!targetCard[playerx.playerid] || playerx.countCards('h', card => { + return game.checkMod(card, player, "unchanged", "cardEnabled2", player) === false; + }) > Math.ceil(playerx.countCards('h') / 2)) { + continue; + } + const name = targetCard[playerx.playerid]; + if (!player.hasUseTarget({ name: name })) { + continue; + } + const { cards } = await playerx + .chooseCard({ + position: "h", + selectCard: Math.ceil(playerx.countCards('h') / 2), + forced: true, + prompt: `将一半手牌当作${get.translation(name)}使用`, + filterCard: (card, player) => { + return game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false; + }, + ai: (card) => { + return 10 - get.value(card); + } + }) + .forResult(); + const cardx = get.autoViewAs({ name: name }, cards); + if (!lib.filter.cardEnabled(cardx, player)) { + continue; + } + await playerx.chooseUseTarget({ + card: get.autoViewAs({ name: name }), + cards, + forced: true, + }); + } + }, + }, + sxrmfanxin: { + audio: 2, + derivation: ["baonu", "wumou"], + trigger: { + global: ["phaseBefore", "dieAfter"], + player: "enterGame", + }, + filter(event, player) { + if (event.name == "die") { + return player.storage["sxrmfanxin"]?.includes(event.player); + } + return event.name != "phase" || game.phaseNumber == 0; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget({ + prompt: get.prompt("sxrmfanxin"), + filterTarget: (card, player, target) => { + return target != player && !player.storage["sxrmfanxin"]?.includes(target); + }, + ai: (target) => { + const player = get.player(); + return -get.attitude(player, target); + } + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + target.addSkills(["baonu", "wumou"]); + player.markAuto(event.name, [target]); + }, + group: ["sxrmfanxin_draw"], + subSkill: { + draw: { + trigger: { global: "phaseBegin" }, + filter(event, player) { + const target = event.player; + return player.storage["sxrmfanxin"]?.includes(target) && target.hasSkill("baonu") && target.countMark("baonu"); + }, + async cost(event, trigger, player) { + const target = trigger.player, num = target.countMark("baonu"); + let list = Array.from({ length: num }, (_, i) => String(i + 1)) + list.push("cancel2"); + console.log(list); + const result = await player + .chooseControl({ + prompt: get.prompt("sxrmbingqu"), + prompt2: `移去${get.translation(target)}的至多5个暴怒标记并摸等量的牌`, + controls: list, + ai: () => { + const num = get.event("num"); + return num - 1; + } + }) + .set("num", num) + .forResult(); + event.result = { + bool: result.control != "cancel2", + cost_data: result.index + 1, + }; + }, + async content(event, trigger, player) { + const num = event.cost_data; + trigger.player.removeMark("baonu", num); + player.draw(num); + }, + } + } + }, + //嗔贾华 + sxrmfubei: { + audio: 2, + enable: "phaseUse", + usable: 1, + async content(event, trigger, player) { + await player.drawTo(player.maxHp); + if (player.countCards('h') < 2) { + return; + } + let { cards } = await player + .chooseCard({ + prompt: "选择置入牌堆的两张牌", + forced: true, + selectCard: 2, + position: "he", + ai: (card) => { + return 10 - get.value(card); + } + }) + .forResult(); + if (cards?.length != 2) { + return; + } + const [card1, card2] = cards; + const insertRange = Math.min(ui.cardPile.childElementCount + 2, 10); + const result = await player + .chooseNumbers({ + prompt: "请依次选择两张牌插入的位置", + forced: true, + list: [ + { + prompt: `将${get.translation(card1)}置于牌堆顶的第()张`, + min: 1, + max: insertRange, + }, + { + prompt: `将${get.translation(card2)}置于牌堆顶的第()张`, + min: 1, + max: insertRange, + } + ], + filterOk: (event) => { + return event.numbers.toUniqued()?.length == 2; + }, + processAI: () => { + const list = Array.from({ length: get.event("range0") }).map((val, idx) => idx + 1); + if (list.length >= 2) { + list.remove(1); + } + return [list.randomRemove(), list.randomRemove()]; + } + }) + .set("range0", insertRange) + .forResult(); + const [num1, num2] = result.numbers; + if (num1 > num2) { + cards = [card2, card1]; + } + await player + .lose(cards, ui.cardPile) + .set("insert_index", (event, card) => { + const nums = get.event("nums"), cardsx = get.event("cardsx"); + return ui.cardPile.childNodes[nums[cardsx.indexOf(card)] - 1]; + }) + .set("nums", [num1, num2]) + .set("cardsx", [card1, card2]); + game.log(player, "将", card1, "与", card2, `分别置于牌堆顶的第${num1}张与第${num2}张`); + player.addTempSkill("sxrmfubei_damage", { global: "washCard" }); + player.markAuto("sxrmfubei_damage", [card1, card2]); + }, + group: "sxrmfubei_clear", + subSkill: { + damage: { + forced: true, + locked: false, + mark: true, + intro: { + content(storage) { + if (!storage.length) return ""; + let str = "地雷位置:"; + for (let card of storage) { + str += `
    ${get.translation(card)}:`; + const pile = Array.from(ui.cardPile.childNodes); + let num = pile.indexOf(card) + 1; + if (num == 0) { + str += "不在牌堆中"; + } + else { + str += `牌堆第${num}张`; + } + } + return str; + }, + }, + trigger: { global: "phaseEnd" }, + filter(event, player) { + if (!player.storage["sxrmfubei_damage"]?.length) return false; + const card = ui.cardPile.childNodes[0]; + return player.storage["sxrmfubei_damage"].includes(card); + }, + async content(event, trigger, player) { + const target = trigger.player; + player.line(target); + target.damage(); + }, + onremove: true, + sub: true, + sourceSkill: "sxrmfubei", + }, + clear: { + forced: true, + charlotte: true, + popup: false, + trigger: { + global: ["cardsGotoOrderingEnd", "cardsGotoOrderingBegin", "gainEnd", "gainBegin", "addJudgeEnd", "addJudgeBegin", "addToExpansionEnd", "addToExpansionBegin"] + }, + filter(event, player) { + if (!player.storage["sxrmfubei_damage"]?.length) return false; + const pile = Array.from(ui.cardPile.childNodes); + return player.storage["sxrmfubei_damage"].some(i => pile.indexOf(i) == -1); + }, + async content(event, trigger, player) { + let cards = player.getStorage("sxrmfubei_damage"); + if (!cards?.length) return; + const pile = Array.from(ui.cardPile.childNodes); + cards.forEach(i => { + if (pile.indexOf(i) == -1) { + player.storage["sxrmfubei_damage"].remove(i); + } + }); + player.updateMark("sxrmfubei_damage", true); + }, + sub: true, + sourceSkill: "sxrmfubei", + }, + }, + ai: { + order: 2, + result: { + player(player) { + if (player.maxHp - player.countCards("h") >= 2) return 1; + return -1; + }, + }, + }, + }, + sxrmdancui: { + audio: 2, + locked(skill, player) { + if (!player?.storage.sxrmdancui) { + return false; + } + return true; + }, + qidingSkill(skill, player) { + if (!player?.storage.sxrmdancui) { + return true; + } + return false; + }, + trigger: { source: "damageBegin1" }, + async cost(event, trigger, player) { + const qiding = Boolean(player.storage["sxrmdancui"]) + , target = trigger.player + , description = lib.dynamicTranslate["sxrmdancui"](player, "sxrmdancui"); + if (player.countDiscardableCards(player, "he") < 2) { + if (qiding) { + event.result = { + bool: true, + cost_data: player.getDiscardableCards(player, "he"), + }; + } + else { + const result = await player + .chooseBool({ + prompt: `是否弃置2张牌(所有牌),使${get.translation(target)}受到的伤害值+1?`, + prompt2: description, + ai: () => { + const player = get.player(), target = get.event("target"); + return get.attitude(player, target) < 0; + } + }) + .set("target", target) + .forResult(); + event.result = { + bool: result.bool, + cost_data: player.getDiscardableCards(player, "he"), + } + } + } + else { + const result = await player + .chooseCard({ + prompt: `${qiding ? "" : "是否"}弃置2张牌,使${get.translation(target)}受到的伤害值+1${qiding ? "。" : "?"}`, + prompt2: description, + forced: qiding, + position: "he", + selectCard: 2, + filterCard: (card, player) => { + return player.getDiscardableCards(player, "he").includes(card); + }, + ai: (card) => { + const player = get.player(), target = get.event("target"); + if (get.attitude(player, target) >= 0) { + return -1; + } + return 5 - get.value(card); + } + }) + .set("target", target) + .forResult(); + event.result = { + bool: result.bool, + cost_data: result.cards, + } + } + }, + async content(event, trigger, player) { + player.awakenQidingSkill(event.name); + const cards = event.cost_data; + if (cards?.length) await player.discard(cards); + trigger.num++; + }, + mark: true, + intro: { + content: "qidingSkill", + }, + }, + //嗔赵云 + sxrmzhaduo: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return game.countPlayer(current => { + return player != current && current.countGainableCards(player, "he"); + }) >= 2; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget({ + prompt: "是否获得两名其他角色各一张牌?", + prompt2: get.translation("sxrmzhaduo_info"), + selectTarget: 2, + filterTarget: (card, player, target) => { + return player != target && target.countGainableCards(player, "he"); + }, + ai: (target) => { + const player = get.player(); + return -get.attitude(player, target); + } + }) + .forResult(); + }, + async content(event, trigger, player) { + let targets = event.targets; + for (let i of targets) { + if (!i.isIn()) continue; + await player.gainPlayerCard({ + target: i, + forced: true, + position: "he" + }); + } + let targetsx = targets.filter(i => { + return i.isIn() && player.canUse({ name: "sha", isCard: true }, i, false); + }); + if (!targetsx.length) { + return; + } + const result = await player + .chooseTarget({ + prompt: "视为对其中一名角色使用一张【杀】", + forced: true, + filterTarget: (card, player, target) => { + return targetsx.includes(target); + }, + ai: (target) => { + const player = get.player(); + return get.effect(target, { name: "sha" }, player, player); + }, + }) + .forResult(); + const target1 = result.targets[0]; + targets.remove(target1); + const target2 = targets[0]; + const card1 = new lib.element.VCard({ name: "sha", isCard: true }); + const skills1 = target2.getSkills(null, false, false); + await player.removeAdditionalSkill("sxrmzhaduo"); + await player.addAdditionalSkill("sxrmzhaduo", skills1); + await player.useCard(card1, target1); + await player.removeAdditionalSkill("sxrmzhaduo"); + if (!target2.isIn() || !target2.canUse({ name: "juedou", isCard: true }, player)) { + return; + } + const card2 = new lib.element.VCard({ name: "juedou", isCard: true }); + const skills2 = target1.getSkills(null, false, false); + await player.removeAdditionalSkill("sxrmzhaduo"); + await player.addAdditionalSkill("sxrmzhaduo", skills2); + await target2.useCard(card2, player); + await player.removeAdditionalSkill("sxrmzhaduo"); + } + }, + //嗔曹仁 + sxrmyangbei: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "phaseJieshuBegin", "useCardToPlayered"], + }, + filter(event, player, name) { + if (name != "useCardToPlayered") return true; + const { card, targets, target } = event; + return ( + (card.name == "sha" || get.type(card) == "trick") && + targets.length == 1 && + target.countDiscardableCards(target, "h") + ); + }, + async cost(event, trigger, player) { + if (event.triggername != "useCardToPlayered") { + event.result = await player + .chooseBool({ + prompt: "是否摸三张牌并翻面?", + prompt2: get.translation("sxrmyangbei_info"), + ai: () => true + }) + .forResult(); + } + else { + const target = trigger.target; + event.result = await target + .chooseBool({ + prompt: `是否弃置所有手牌,令${get.translation(player)}的技能【佯北】于本回合失效?`, + ai: () => { + const target = get.player(), + { playerx } = get.event; + if (get.attitude(target, playerx) >= 0) return false; + if (!playerx.isTurnedOver()) return false; + switch (target.countCards("h")) { + case 1: + return true; + case 2: + case 3: + return target.countCards("h", card => { + return ["shan", "tao"].includes(card.name); + }) <= 1; + default: + return false; + } + } + }) + .set("playerx", player) + .forResult(); + } + }, + async content(event, trigger, player) { + if (event.triggername != "useCardToPlayered") { + player.draw(3); + player.turnOver(); + } + else { + const target = trigger.target; + target.discard(target.getCards("h")); + player.tempBanSkill(event.name); + } + } + }, + sxrmyinfeng: { + audio: 2, + forced: true, + trigger: { source: "damageEnd" }, + filter(event, player) { + return game.getGlobalHistory("everything", evt => evt.name == "damage" && evt.source == player).indexOf(event) == 0; + }, + async content(event, trigger, player) { + const target = trigger.player; + const num = target.maxHp - target.hp; + if (num) { + await target.loseMaxHp(num); + } + await target.addSkill("sxrmyinfeng_debuff"); + target.storage["sxrmyinfeng_debuff"] = num; + player.markAuto(event.name, [target]); + player + .when({ player: "phaseBegin" }) + .then(() => { + if (!player.storage["sxrmyinfeng"]?.length) return; + for (let i of player.storage["sxrmyinfeng"]) { + if (!i.isIn() || !i.hasSkill("sxrmyinfeng_debuff") || !i.storage["sxrmyinfeng_debuff"]) { + continue; + } + player.line(i); + const num = i.storage["sxrmyinfeng_debuff"]; + i.gainMaxHp(num); + i.removeSkill("sxrmyinfeng_debuff"); + } + delete player.storage["sxrmyinfeng"]; + }) + }, + subSkill: { + debuff: { + inherit: "gangzhi", + forced: true, + charlotte: true, + popup: false, + mark: true, + marktext: "中箭", + intro: { + content(storage) { + return `中了冷箭,暂时损失了${storage || 0}点体力上限,期间造成与受到伤害均视为失去体力。` + }, + }, + }, + }, + }, + + //曼巴 //关羽 @@ -1039,19 +1917,19 @@ const skills = { const result = targets.length > 1 ? await event.current - .chooseTarget(`撼国:获得${get.translation(targets)}中的一名角色一张牌`, true, (card, player, target) => { - return get.event().selectTargets.includes(target); - }) - .set("selectTargets", targets) - .set("ai", target => { - const player = get.player(); - return get.effect(target, { name: "shunshou_copy2" }, player, player); - }) - .forResult() + .chooseTarget(`撼国:获得${get.translation(targets)}中的一名角色一张牌`, true, (card, player, target) => { + return get.event().selectTargets.includes(target); + }) + .set("selectTargets", targets) + .set("ai", target => { + const player = get.player(); + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }) + .forResult() : { - bool: true, - targets: targets, - }; + bool: true, + targets: targets, + }; if (result?.bool) { const target = result.targets[0]; await event.current.gainPlayerCard(target, "he", true); @@ -1449,11 +2327,11 @@ const skills = { cards.length == 1 ? { bool: true, links: cards } : await player - .choosePlayerCard(current, "h", true) - .set("filterButton", button => { - return !get.is.connectedCard(button.link); - }) - .forResult(); + .choosePlayerCard(current, "h", true) + .set("filterButton", button => { + return !get.is.connectedCard(button.link); + }) + .forResult(); if (result?.bool) { connects.set(current, result.links); } @@ -1560,36 +2438,36 @@ const skills = { cards.length == 1 ? { bool: true, links: cards } : await player - .choosePlayerCard(current, "h", true) - .set("ai", button => { - const { player, target } = get.event(); - const { link } = button; - const att = get.attitude(player, target); - let val = get.value(link, target); - if (att > 0) { - if (player == target && player == _status.currentPhase) { - const num = target.countConnectedCards(); - if (num > 0) { - if (get.is.connectedCard(link)) { - val += 3; - } - return val; - } else if (!get.is.connectedCard(link) && !get.tag(link, "damage")) { - return 6.5 - val; + .choosePlayerCard(current, "h", true) + .set("ai", button => { + const { player, target } = get.event(); + const { link } = button; + const att = get.attitude(player, target); + let val = get.value(link, target); + if (att > 0) { + if (player == target && player == _status.currentPhase) { + const num = target.countConnectedCards(); + if (num > 0) { + if (get.is.connectedCard(link)) { + val += 3; } - return 6 - val; - } - if (get.is.connectedCard(link)) { - val += 3; + return val; + } else if (!get.is.connectedCard(link) && !get.tag(link, "damage")) { + return 6.5 - val; } - return val; + return 6 - val; } - if (!get.is.connectedCard(link)) { + if (get.is.connectedCard(link)) { val += 3; } return val; - }) - .forResult(); + } + if (!get.is.connectedCard(link)) { + val += 3; + } + return val; + }) + .forResult(); if (result?.links?.length) { connects.set(current, result.links); } @@ -1832,7 +2710,7 @@ const skills = { async content(event, trigger, player) { player .when("phaseUseAfter") - .step(async () => {}) + .step(async () => { }) .assign({ mod: { cardUsable(card, player, num) { @@ -1866,7 +2744,7 @@ const skills = { async content(event, trigger, player) { player .when("phaseDiscardAfter") - .step(async () => {}) + .step(async () => { }) .assign({ mod: { maxHandcardFinal(player, num) { @@ -2081,15 +2959,15 @@ const skills = { const result = targets.length > 1 ? await player - .chooseTarget("鄙诈:与一名角色拼点", true, (card, player, target) => player.canCompare(target)) - .set("ai", target => { - return -get.attitude(get.player(), target); - }) - .forResult() + .chooseTarget("鄙诈:与一名角色拼点", true, (card, player, target) => player.canCompare(target)) + .set("ai", target => { + return -get.attitude(get.player(), target); + }) + .forResult() : { - bool: true, - targets: targets, - }; + bool: true, + targets: targets, + }; if (result?.bool) { const target = result.targets[0]; const result2 = await player.chooseToCompare(target).forResult(); @@ -2177,28 +3055,28 @@ const skills = { const result2 = targets.length > 1 ? await player - .chooseTarget( - `选择${get.translation(card)}的使用者`, - (card, player, target) => { - return get.event().canUse.includes(target); - }, - true - ) - .set("canUse", targets) - .set("targetx", target) - .set("willUse", card) - .set("ai", target => { - const { player, targetx, willUse } = get.event(); - if (target == player) { - return get.effect(targetx, willUse, target, player); - } - return get.effect(player, willUse, target, player); - }) - .forResult() + .chooseTarget( + `选择${get.translation(card)}的使用者`, + (card, player, target) => { + return get.event().canUse.includes(target); + }, + true + ) + .set("canUse", targets) + .set("targetx", target) + .set("willUse", card) + .set("ai", target => { + const { player, targetx, willUse } = get.event(); + if (target == player) { + return get.effect(targetx, willUse, target, player); + } + return get.effect(player, willUse, target, player); + }) + .forResult() : { - bool: true, - targets: targets, - }; + bool: true, + targets: targets, + }; if (!result2?.bool) { return; } @@ -2296,7 +3174,7 @@ const skills = { .when({ global: ["phaseAfter", "phaseBeforeStart"], }) - .step(async () => {}) + .step(async () => { }) .assign({ mod: { cardname(card, player) { @@ -2514,12 +3392,12 @@ const skills = { targets.length == 1 ? { bool: true, targets } : await player - .chooseTarget("枯心:选择一名其他角色获得其未展示的手牌", true, lib.filter.notMe) - .set("ai", target => { - const player = get.player(); - return -get.attitude(player, target) * target.countCards("h"); - }) - .forResult(); + .chooseTarget("枯心:选择一名其他角色获得其未展示的手牌", true, lib.filter.notMe) + .set("ai", target => { + const player = get.player(); + return -get.attitude(player, target) * target.countCards("h"); + }) + .forResult(); if (result?.targets?.length) { game.log(player, "选择了", "#g【枯心】", "的", "#y选项二"); const [target] = result.targets; @@ -2553,12 +3431,12 @@ const skills = { !target._dekuxin_eff && get.tag(card, "damage") && target.getHp() > - (player.hasSkillTag("damageBonus", true, { - card: card, - target: target, - }) - ? 2 - : 1) + (player.hasSkillTag("damageBonus", true, { + card: card, + target: target, + }) + ? 2 + : 1) ) { if (player.hasSkillTag("jueqing", false, target)) { return [1, -2]; diff --git a/apps/core/character/sxrm/sort.js b/apps/core/character/sxrm/sort.js index 57709dde4c..377050482f 100644 --- a/apps/core/character/sxrm/sort.js +++ b/apps/core/character/sxrm/sort.js @@ -1,7 +1,7 @@ const characterSort = { shixinrumo_yi: ["sxrm_caocao", "sxrm_liubei", "sxrm_jianggan", "sxrm_huatuo", "sxrm_lvboshe", "sxrm_fuhuanghou", "sxrm_xunyu", "sxrm_caopi", "sxrm_wanghou"], shixinrumo_man: ["sxrm_guanyu", "sxrm_guanyinping", "sxrm_yujin", "sxrm_mifang", "sxrm_liufeng", "sxrm_luxun", "sxrm_lvmeng", "sxrm_pangde", "sxrm_yanwen"], - shixinrumo_chen: ["sxrm_zhouyu", "sxrm_sunshangxiang", "sxrm_zhangzhao"], + shixinrumo_chen: ["sxrm_zhouyu", "sxrm_sunshangxiang", "sxrm_zhangzhao", "sxrm_lusu", "sxrm_chen_caocao", "sxrm_zhugeliang", "sxrm_jiahua", "sxrm_zhaoyun", "sxrm_caoren"], }; const characterSortTranslate = { diff --git a/apps/core/character/sxrm/translate.js b/apps/core/character/sxrm/translate.js index 6ab9cbdc06..4fcb672863 100644 --- a/apps/core/character/sxrm/translate.js +++ b/apps/core/character/sxrm/translate.js @@ -130,6 +130,39 @@ const translates = { sxrmxiezhong_info: "准备阶段,你可令场上半数角色(向上取整)依次选择并执行一项:1.摸两张牌,失去 1 点体力;2.将两张牌当【杀】使用。然后你可以令另一名角色执行两次被选择较多的一项。", sxrmqishi: "乞施", sxrmqishi_info: `${get.poptip("sxrm_qidingSkill")}。结束阶段,你可以获得本回合其他角色进入弃牌堆的至多五张牌,然后你跳过下个摸牌阶段。`, + sxrm_lusu: "嗔鲁肃", + sxrm_lusu_prefix: "嗔", + sxrmwanli: "万利", + sxrmwanli_info: "首轮开始时,你可以交给一名其他角色任意张牌,第四轮结束时若你存活,其交给你三倍数量的牌(不足则全给并失去所有技能);若其已还牌或死亡,你摸牌阶段多摸三张牌。", + sxrmlishui: "理说", + sxrmlishui_info: "当你成为黑色牌的目标时,你可以摸一张牌并与一名未还牌的“万利”角色拼点:若你赢,其提前一轮还牌(不会提前到本轮前)。", + sxrm_chen_caocao: "嗔曹操", + sxrm_chen_caocao_prefix: "嗔", + sxrmlanjiao: "揽娇", + sxrmlanjiao_info: "出牌阶段对每名角色限一次,你可以展示一名其他角色两张手牌,然后你获得展示的牌;其可以在你展示这些牌时失去1点体力并摸一张牌,令你重新展示。若你一回合内因此获得过♥和♦牌,此技能本回合失效。", + sxrm_zhugeliang: "嗔诸葛亮", + sxrm_zhugeliang_prefix: "嗔", + sxrmbingqu: "并驱", + sxrmbingqu_info: "准备阶段,你可以与一名其他角色各声明一种普通锦囊牌,然后双方依次将半数手牌(向上取整)当对方声明的牌使用。", + sxrmfanxin: "燔心", + sxrmfanxin_info: "游戏开始或“燔心”角色死亡后,你可以令一名其他角色获得【狂暴】【无谋】;其回合开始时,你可以移去其至多5枚“暴怒”并摸等量的牌。", + sxrm_jiahua: "嗔贾华", + sxrm_jiahua_prefix: "嗔", + sxrmfubei: "伏备", + sxrmfubei_info: "出牌阶段限一次,你可以将手牌摸至体力上限,然后将两张牌正面朝上置于牌堆顶前十张的任意位置(对其他角色可见);每名角色回合结束时,若牌堆顶的牌正面朝上,你须对其造成1点伤害。", + sxrmdancui: "殚瘁", + sxrmdancui_info: `${get.poptip("sxrm_qidingSkill")}。当你造成伤害时,你可以弃置两张牌(无牌则不弃,不足则全弃),令此伤害+1。`, + sxrm_zhaoyun: "嗔赵云", + sxrm_zhaoyun_prefix: "嗔", + sxrmzhaduo: "诈夺", + sxrmzhaduo_info: "结束阶段,你可以获得两名其他角色各一张牌,视为对其中一名角色使用一张【杀】,然后另一名角色视为对你使用一张【决斗】;在和其中一名角色的结算过程中,你视为拥有另一名角色的所有技能。", + sxrm_caoren: "嗔曹仁", + sxrm_caoren_prefix: "嗔", + sxrmyangbei: "佯北", + sxrmyangbei_info: "准备阶段和结束阶段,你可以翻面并摸三张牌。当你使用【杀】或普通锦囊牌指定唯一目标后,其可以弃置所有手牌令此技能本回合失效。", + sxrmyinfeng: "阴锋", + sxrmyinfeng_info: "锁定技,当你每回合首次造成伤害后,将受伤角色体力上限减至其体力值且其接下来造成和受到的伤害均视为失去体力,直到你下回合开始。", + }; export default translates; From fcef0363abc099a26701ef4e0aa32f15805bd3f4 Mon Sep 17 00:00:00 2001 From: Lonely Patients Date: Wed, 17 Jun 2026 20:37:16 +0800 Subject: [PATCH 07/12] Update skill.js --- apps/core/character/sxrm/skill.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/apps/core/character/sxrm/skill.js b/apps/core/character/sxrm/skill.js index 74812bad9b..6cbd2fb17f 100644 --- a/apps/core/character/sxrm/skill.js +++ b/apps/core/character/sxrm/skill.js @@ -435,9 +435,9 @@ const skills = { content(storage, player) { let str = ""; if (storage?.length) { - str = "本回合不能使用" + storage.map(i => get.translation(i)).join("、") + "牌"; + str = "本回合不能使用" + storage.map(i => get.translation(i)).join("、") + "牌且"; } - str += "且受到的伤害+1"; + str += "受到的伤害+1"; return str; }, }, @@ -494,10 +494,10 @@ const skills = { if (!skill) { return; } - target.removeSkill(skill); + await target.removeSkill(skill); for (const current of [player, target]) { current.storage.sxrmfusui_skill = skill; - current.addSkill("sxrmbiyi"); + await current.addSkill("sxrmbiyi"); current.addTempSkill("sxrmfusui_prevent", { player: "roundStart" }); } }, @@ -517,6 +517,10 @@ const skills = { async content(event, trigger, player) { trigger.cancel(); }, + mark: true, + intro: { + content: "防止本轮受到的伤害", + }, ai: { nofire: true, nothunder: true, @@ -563,7 +567,7 @@ const skills = { player: ["useSkill", "logSkillBegin"], }, filter(event, player) { - const skill = event.skill || event.sourceSkill; + const skill = get.sourceSkillFor(event); if (!skill) { return false; } @@ -575,8 +579,6 @@ const skills = { if (info && info.charlotte) { return false; } - console.log(skill); - console.log(currentSkill); return skill == currentSkill; }, async content(event, trigger, player) { @@ -595,9 +597,6 @@ const skills = { //嗔张昭 sxrmxiezhong: { audio: 2, - trigger: { - player: "phaseZhunbeiBegin", - }, filter(event, player) { return game.countPlayer() > 1; }, @@ -718,7 +717,7 @@ const skills = { prompt: `选择一名角色,令其执行两次“${num == 0 ? "摸两张牌并失去一点体力" : "将两张牌当【杀】使用"}”的选项`, filterTarget(card, player, target) { const { targets } = get.event(); - return !targets.includes(target); + return !targets?.includes(target); }, forced: true, ai(target) { @@ -799,7 +798,7 @@ const skills = { return false; } const card0 = get.autoViewAs({ name: "sha" }, [card1, card2]); - return lib.filter.cardEnabled(card0, player); + return lib.filter.cardEnabled(card0, player) && player.hasUseTarget(get.autoViewAs({name:'sha',cards)})); }); }); }, From b5bc5d86acd16d16fc50ee1240556f07215406ab Mon Sep 17 00:00:00 2001 From: Lonely Patients Date: Wed, 17 Jun 2026 22:44:21 +0800 Subject: [PATCH 08/12] Update translate.js --- apps/core/character/sxrm/translate.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/core/character/sxrm/translate.js b/apps/core/character/sxrm/translate.js index 4fcb672863..f0832bd816 100644 --- a/apps/core/character/sxrm/translate.js +++ b/apps/core/character/sxrm/translate.js @@ -121,7 +121,7 @@ const translates = { sxrmjiaozong: "骄纵", sxrmjiaozong_info: "准备阶段或当你成为【杀】的目标后,你可以移动场上一张装备牌至一名角色装备区内,其本回合不能使用与之颜色相同的牌且受到的伤害+1。", sxrmfusui: "妇随", - sxrmfusui_info: "限定技,出牌阶段,你可以选择一名其他男性角色的一个非标签技能,你令其失去此技能,然后你与其获得“比翼”并防止你们本轮受到的伤害。", + sxrmfusui_info: `限定技,出牌阶段,你可以选择一名其他男性角色的一个非标签技能,你令其失去此技能,然后你与其获得【${get.poptip("sxrmbiyi")}】并防止你们本轮受到的伤害。`, sxrmbiyi: "比翼", sxrmbiyi_info: "转换技,你视为拥有:阳:因【妇随】失去的技能;阴:【枭姬】。当你发动上述对应技能后,切换本技能状态。", sxrm_zhangzhao: "嗔张昭", @@ -145,7 +145,7 @@ const translates = { sxrmbingqu: "并驱", sxrmbingqu_info: "准备阶段,你可以与一名其他角色各声明一种普通锦囊牌,然后双方依次将半数手牌(向上取整)当对方声明的牌使用。", sxrmfanxin: "燔心", - sxrmfanxin_info: "游戏开始或“燔心”角色死亡后,你可以令一名其他角色获得【狂暴】【无谋】;其回合开始时,你可以移去其至多5枚“暴怒”并摸等量的牌。", + sxrmfanxin_info: "游戏开始或“燔心”角色死亡后,你可以令一名其他角色获得【${get.poptip("baonu")}】【${get.poptip("wumou")}】;其回合开始时,你可以移去其至多5枚“暴怒”并摸等量的牌。", sxrm_jiahua: "嗔贾华", sxrm_jiahua_prefix: "嗔", sxrmfubei: "伏备", From 085ec0177a6d57c021051b2445b7ca86af956451 Mon Sep 17 00:00:00 2001 From: ycyutian <2414374457@qq.com> Date: Sun, 28 Jun 2026 23:39:04 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E5=A8=81=E5=85=B3=E9=93=B6=E5=B1=8F?= =?UTF-8?q?=E3=80=81=E8=B0=8B=E7=8E=8B=E5=B9=B3=E3=80=81=E8=B0=8B=E9=A9=AC?= =?UTF-8?q?=E8=B0=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/xianding/character.js | 20 + .../core/character/xianding/characterTitle.js | 3 + apps/core/character/xianding/skill.js | 740 ++++++++++++++++++ apps/core/character/xianding/sort.js | 4 +- apps/core/character/xianding/translate.js | 18 + 5 files changed, 784 insertions(+), 1 deletion(-) diff --git a/apps/core/character/xianding/character.js b/apps/core/character/xianding/character.js index 24eece80d2..ff6f2f2883 100644 --- a/apps/core/character/xianding/character.js +++ b/apps/core/character/xianding/character.js @@ -1,4 +1,24 @@ +import skills from "./skill"; + const characters = { + v_guanyinping: { + sex: "female", + group: "shu", + hp: 4, + skills: ["dcshaowei", "dcdichou"], + }, + dc_sb_wangping: { + sex: "male", + group: "shu", + hp: 4, + skills: ["dcsbyouyi", "dcsbfangong"], + }, + dc_sb_masu: { + sex: "male", + group: "shu", + hp: 3, + skills: ["dcsbchengce", "dcsbxinzhan"], + }, dc_shen_caopi: { sex: "male", group: "shen", diff --git a/apps/core/character/xianding/characterTitle.js b/apps/core/character/xianding/characterTitle.js index 3f2c7ee38d..a7af020e34 100644 --- a/apps/core/character/xianding/characterTitle.js +++ b/apps/core/character/xianding/characterTitle.js @@ -1,4 +1,7 @@ export default { + //v_guanyinping: "", + //dc_sb_wangping: "", + //dc_sb_masu: "", //dc_shen_caopi: "", //dc_xia_wangyue: "", //shie: "", diff --git a/apps/core/character/xianding/skill.js b/apps/core/character/xianding/skill.js index 8fc28e079c..766e9992d0 100644 --- a/apps/core/character/xianding/skill.js +++ b/apps/core/character/xianding/skill.js @@ -1,8 +1,748 @@ +// @ts-nocheck import { lib, game, ui, get, ai, _status } from "noname"; import cards from "../sp2/card.js"; /** @type { importCharacterConfig["skill"] } */ const skills = { + //威关银屏 + dcshaowei:{ + audio: 2, + forced: true, + locked: false, + trigger: { + player:"loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + if (event.name == "gain" && event.player == player) { + return false; + } + const evt = event.getl(player); + if (!evt?.cards2?.length) { + return false; + } + return ["diamond", "heart"].some(suit => { + return evt.cards2.some(i => get.suit(i, player) == suit) && !player.getStorage("dcshaowei_used")?.includes(suit); + }); + }, + async content(event, trigger, player) { + const evt = trigger.getl(player); + if (!evt?.cards2?.length) { + return; + } + const suits = ["diamond", "heart"].filter(suit => { + return evt.cards2.some(i => get.suit(i, player) == suit) && !player.getStorage("dcshaowei_used")?.includes(suit); + }); + if (suits.includes("diamond")) { + let cardsx = []; + while (cardsx.length < 3) { + const card = get.cardPile2(i => get.color(i) == "red" && !cardsx.includes(i)); + if (card) { + cardsx.push(card); + } + else { + break; + } + } + if (cardsx.length) { + await player.gain(cardsx, "draw"); + } + player.addTempSkill("dcshaowei_used"); + player.markAuto("dcshaowei_used", ["diamond"]); + } + if (suits.includes("heart")) { + await player.recover(); + if (player.hasDisabledSlot()) { + await player.chooseToEnable(); + } + player.addTempSkill("dcshaowei_used"); + player.markAuto("dcshaowei_used", ["heart"]); + } + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + sub: true, + sourceSkill: "dcshaowei", + }, + } + }, + dcdichou: { + audio: 2, + forced: true, + intro: { + content: "mark", + name2: "仇", + }, + marktext: "仇", + trigger: { + target: "useCardToTarget", + }, + filter(event, player) { + return event.player != player; + }, + async content(event, trigger, player) { + const target = trigger.player; + if (target.isIn()) { + target.addMark("dcdichou", 1); + } + }, + group: ["dcdichou_discard", "dcdichou_draw", "dcdichou_damage"], + subSkill: { + discard: { + forced: true, + trigger: { + player: "phaseBegin", + }, + filter(event,player){ + return player.hasEnabledSlot() || game.countPlayer(i => i.countMark("dcdichou") && i.countDiscardableCards(player, "he")); + }, + async content(event, trigger, player) { + if (player.hasEnabledSlot()) { + await player.chooseToDisable(); + } + if (game.countPlayer(i => i.countMark("dcdichou") && i.countDiscardableCards(player, "he"))) { + const result = await player + .chooseTarget({ + prompt: "弃置一名有“仇”的角色一张牌", + filterTarget(card, player, target) { + return target.countMark("dcdichou") && target.countDiscardableCards(player, "he"); + }, + forced: true, + ai: (target) => { + return -get.attitude(get.player(), target); + }, + }) + .forResult(); + const target = result.targets[0]; + const { links } = await player + .discardPlayerCard({ + target, + forced: true, + position: "he", + }) + .forResult(); + const card = links[0]; + if (!card) { + return; + } + const num = get.translation(get.name(card)).length; + if (!num) { + return; + } + player.addTempSkill("dcdichou_eff"); + player.addMark("dcdichou_eff", num); + } + }, + sub: true, + sourceSkill: "dcdichou", + }, + eff: { + audio: 2, + charlotte: true, + mark: true, + intro: { + content: "本回合攻击范围与使用【杀】的次数上限均+#", + }, + onremove: true, + mod: { + attackRange(player, num) { + return num + player.countMark("dcdichou_eff"); + }, + cardUsable(card, player, num) { + if (card.name == "sha") { + return num + player.countMark("dcdichou_eff"); + } + }, + }, + sub: true, + sourceSkill: "dcdichou", + }, + draw: { + forced: true, + trigger: { + player: "useCardToPlayer", + }, + filter(event, player) { + return event.target.countMark("dcdichou"); + }, + async content(event, trigger, player) { + const target = trigger.target; + target.removeMark("dcdichou", 1); + await player.draw(); + }, + sub: true, + sourceSkill: "dcdichou", + }, + damage: { + forced: true, + trigger: { + player: "phaseEnd", + }, + filter(event, player) { + return game.countPlayer(i => i.countMark("dcdichou")); + }, + async content(event, trigger, player) { + const result = await player + .chooseTarget({ + prompt: "对任意名有“仇”的角色各造成一点火焰伤害并移除其“仇”", + selectTarget: [1, Infinity], + forced: true, + filterTarget: (card, player, target) => { + return target.countMark("dcdichou"); + }, + ai: (target) => { + const player = get.player(); + if (get.damageEffect(target, player, player, "fire") > 0) return 1; + return 0; + } + }) + .forResult(); + if (!result.targets?.length) { + return; + } + const targets = result.targets.sortBySeat(); + player.line(targets); + for (let target of targets) { + if (!target.isIn()) continue; + target.damage("fire"); + target.removeMark("dcdichou", target.countMark("dcdichou")); + } + }, + sub: true, + sourceSkill: "dcdichou", + }, + }, + }, + //谋王平 + dcsbyouyi: { + audio: 2, + trigger: { + target: "useCardToTarget", + }, + filter(event, player) { + if (!event.player.isIn()) { + return false; + } + if (!get.tag(event.card, "damage") || event.player == player) { + return false; + } + if (!player.getStorage("dcsbyouyi_used")?.length) { + return true; + } + let storage = player.getStorage("dcsbyouyi_used") + if (!storage.includes("discard")) { + return player.countDiscardableCards("he"); + } + if (!storage.includes("loseHp")) { + return true; + } + return false; + }, + async cost(event, trigger, player) { + let choiceList = [ + "弃置任意张牌,本回合结束时摸等量牌。", + "失去至多3点体力,令一名角色摸等量牌,本回合结束时回复等量体力。", + ]; + let controlList = ["弃置牌", "失去体力", "cancel2"]; + for (let i of [0, 1]) { + let list = ["discard", "loseHp"]; + let bool1 = player.getStorage("dcsbyouyi_used")?.includes(list[i]); + let bool2 = (i == 0 ? Boolean(!player.countDiscardableCards("he")) : false); + if (bool1 || bool2) { + if (bool1) choiceList[i] += "(已发动)"; + else choiceList[i] += "(无法执行)"; + choiceList[i] = `'${choiceList[i]}`; + controlList[i] = ""; + } + } + controlList = controlList.filter(i => i!=""); + const result = await player + .chooseControl({ + prompt: get.prompt("dcsbyouyi"), + controls: controlList, + choiceList: choiceList, + ai: () => { + const list = get.event("list"), + player = get.player(); + if (list.includes("弃置牌") && player.countCards("he", i => { + if (["wuxie", "shan", "tao"].includes(get.name(i, player))) { + return false; + } + let val = 5 - get.value(i, player); + if (player.getStorage("dcsbfangong")) { + val += 1; + } + return val >= 3; + })) { + return "弃置牌"; + } + if (list.includes("失去体力") && player.hp >= 3) { + return "失去体力"; + } + return "cancel2"; + } + }) + .set("list", choiceList) + .forResult(); + event.result = { + bool: result.control != "cancel2", + cost_data: result.control, + }; + }, + async content(event, trigger, player) { + const user = trigger.player; + if (!user.isIn()) { + return; + } + player.line(user); + user.addTempSkill("dcsbyouyi_sha"); + user.addMark("dcsbyouyi_sha"); + const control = event.cost_data; + if (control == "弃置牌") { + const result = await player + .chooseToDiscard({ + position: "he", + selectCard: [1, Infinity], + forced: true, + ai: (card) => { + const player = get.player(); + if (["wuxie", "shan", "tao"].includes(get.name(card, player))) { + return 0; + } + let val = 5 - get.value(card, player); + if (player.getStorage("dcsbfangong")) { + val += 1; + } + if (val < 3) val = 0; + return val; + } + }) + .forResult(); + player.addTempSkill("dcsbyouyi_used"); + player.markAuto("dcsbyouyi_used", ["discard"]); + if (!player.storage["dcsbyouyi_eff"]) { + player.storage["dcsbyouyi_eff"] = { + draw: 0, + recover: 0, + sum: 0, + }; + } + player.storage["dcsbyouyi_eff"].draw += result.cards.length; + player.storage["dcsbyouyi_eff"].sum += result.cards.length; + } + else { + const result = await player + .chooseControl({ + controls: ["1", "2", "3"], + prompt: "选择失去的体力值", + ai: () => { + const player = get.player(); + return String(Math.min(3, Math.max(1, player.hp - 2))); + }, + }) + .forResult(); + const num = Number(result.control); + await player.loseHp(num); + const result1 = await player + .chooseTarget({ + prompt: `令一名角色摸${get.cnNumber(num)}张牌`, + forced: true, + ai: (target) => { + return get.attitude(get.player(), target); + } + }) + .forResult(); + const target = result1.targets[0]; + await target.draw(num); + player.addTempSkill("dcsbyouyi_used"); + player.markAuto("dcsbyouyi_used", ["loseHp"]); + if (!player.storage["dcsbyouyi_eff"]) { + player.storage["dcsbyouyi_eff"] = { + draw: 0, + recover: 0, + sum: 0, + }; + } + player.storage["dcsbyouyi_eff"].recover += num; + player.storage["dcsbyouyi_eff"].sum += num; + } + const sum = player.storage["dcsbyouyi_eff"]?.sum; + if (!sum) { + return; + } + if (sum >= 7) { + player.storage["dcsbyouyi_eff"].sum = sum % 7; + game.log(player, "重置了", "#g【返攻】"); + player.restoreSkill("dcsbfangong"); + } + }, + group: "dcsbyouyi_eff", + subSkill: { + sha: { + charlotte: true, + mark: true, + intro: { + content: "本回合使用【杀】次数+#", + }, + mod: { + cardUsable(card, player, num) { + if (card.name == "sha") { + return num + player.countMark("dcsbyouyi_sha"); + } + }, + }, + onremove: true, + sub: true, + sourceSkill:"dcsbyouyi", + }, + used: { + charlotte: true, + sub: true, + mark: true, + intro: { + content(storage, player) { + let str = ""; + if (!player.storage["dcsbyouyi_eff"]) { + return str; + } + const { draw, recover } = player.storage["dcsbyouyi_eff"]; + if (draw) str += `
  • 本回合结束时,摸${draw}张牌。`; + if (draw && recover) str += "
    "; + if (recover) str += `
  • 本回合结束时,回复${recover}点体力。`; + return str; + }, + }, + onremove: true, + sourceSkill: "dcsbyouyi", + }, + eff: { + charlotte: true, + forced: true, + popup: false, + trigger: { + global: ["phaseEnd", "phaseBeginStart"], + }, + filter(event, player) { + if (!player.storage["dcsbyouyi_eff"]) return false; + const { draw, recover } = player.storage["dcsbyouyi_eff"]; + return draw || recover; + }, + async content(event, trigger, player) { + if (!player.storage["dcsbyouyi_eff"]) return; + if (event.triggername == "phaseEnd") { + const { draw, recover } = player.storage["dcsbyouyi_eff"]; + if (draw) player.draw(draw); + if (recover) player.recover(recover); + } + else { + player.storage["dcsbyouyi_eff"].draw = 0; + player.storage["dcsbyouyi_eff"].recover = 0; + } + }, + sub: true, + sourceSkill: "dcsbyouyi", + }, + }, + }, + dcsbfangong: { + enable: "phaseUse", + limited: true, + skillAnimation: true, + animationColor: "orange", + async content(event, trigger, player) { + player.awakenSkill(event.name, true); + await player.recoverTo(player.maxHp); + await player.draw(Math.min(5, player.countCards("h"))); + }, + mark: true, + intro: { + content(storage, player) { + let str = ""; + if (!storage) str += "限定技【返攻】未发动"; + else str += "限定技【返攻】已发动"; + let storage1 = player.storage["dcsbyouyi_eff"]; + if (!storage1) return str; + str += "
    "; + const sum = storage1.sum; + str += `
  • 再通过【诱夷】弃置${7 - sum}张牌或失去${7 - sum}点体力后刷新【返攻】。`; + return str; + }, + }, + init: (player, skill) => player.storage[skill] = false, + ai: { + order: 7, + result: { + player: 1, + } + }, + }, + //谋马谡 + dcsbxinzhan: { + audio: 2, + trigger: { + player: "useCardToPlayer", + }, + filter(event, player) { + if (!(event.card?.name=="sha" || get.type(event.card)=="trick") || event.targets.length != 1 || event.target == player) { + return false; + } + const eventx = event.getParent(); + let history = player.getHistory("useCard", evt => { + if (eventx.card?.name == "sha") { + return evt != eventx && evt.card?.name == "sha" && evt.targets.length == 1 && evt.target != player; + } + else { + return evt != eventx && get.type(evt.card) == "trick" && evt.targets.length == 1 && evt.target != player; + } + },eventx); + return !history.length; + }, + async content(event, trigger, player) { + const target = trigger.target, + card = trigger.card; + if (!target || !card) return; + const result = await player + .chooseControl("响应", "不响应") + .set("prompt", `猜测你的${get.translation(card)}是否被响应`) + .set("ai", () => { + return [0, 1].randomGet(); + }) + .forResult(); + player.addTempSkill("dcsbxinzhan_eff"); + player.markAuto("dcsbxinzhan_eff", [{ + target: target, + card: card, + result: result.control, + }]); + }, + check(event, player) { + if (!event.target) return false; + return get.attitude(player, event.target) < 0; + }, + subSkill: { + eff: { + forced: true, + charlotte: true, + trigger: { player: "useCardAfter" }, + filter(event, player) { + let storage = player.getStorage("dcsbxinzhan_eff"); + if (!storage) return false; + return storage.some(item => { + return item.card === event.card; + }); + }, + async content(event, trigger, player) { + let item = player.storage["dcsbxinzhan_eff"].find(i => i.card == trigger.card); + player.storage["dcsbxinzhan_eff"].remove(item); + const { target, card, result } = item; + let xiangying = "不响应"; + game.checkGlobalHistory("everything", evt => { + if (["useCard", "respond"].includes(evt.name)) { + if (Array.isArray(evt.respondTo) && evt.respondTo[1] == card) { + xiangying = "响应"; + } + } + }); + if (xiangying == result) { + if (target.isIn() && target.countCards("he")) { + await player.gainPlayerCard(target, 1, "he", true, "visible"); + } + player.recover(); + } + else { + const card0 = get.cardPile(card => card.name == "sha"); + if (card0) { + await player.gain(card0, "gain2"); + } + const cardx = new lib.element.VCard({name: "juedou", isCard: true}); + if (target.isIn() && player.canUse(cardx, target)) { + await player.useCard(cardx, target); + } + } + }, + sub: true, + sourceSkill: "dcsbxinzhan", + }, + }, + }, + dcsbchengce: { + audio: 2, + trigger: { global: "roundStart" }, + filter(event, player) { + return game.countPlayer() > 1; + }, + async content(event, trigger, player) { + const cards = get.cards(2, true); + if (!cards.length) { + return; + } + await game.cardsGotoOrdering(cards); + let list = [["牌堆顶的牌", cards]], prompt = "观看牌堆顶的2张牌"; + let hs = player.getCards("h"); + if (hs.length) { + list.push(["你的手牌", hs]); + prompt = "用任意张手牌交换牌堆顶的等量牌"; + } + const result = await player + .chooseToMove({ + prompt: prompt, + forced: true, + filterMove: (from, to) => { + return typeof to != "number"; + }, + list: list, + num: 2, + }) + .forResult(); + event.forceDie = true; + if (result.moved[1]?.length) { + const lose = result.moved[0].slice(); + const gain = result.moved[1].slice().filter(i => !get.owner(i)); + if (lose.some(i => get.owner(i))) { + await player.lose( + lose.filter(i => get.owner(i)), + ui.special + ); + } + await game.cardsGotoPile(lose.slice().reverse(), "insert"); + game.updateRoundNumber(); + if (gain.length) { + await player.gain(gain, "draw"); + } + } + else { + await game.cardsGotoPile(result.moved[0].slice().reverse(), "insert"); + } + if (game.countPlayer() < 2) { + return; + } + if (player.isIn()) { + const result1 = await player + .chooseTarget({ + prompt: "令一名其他角色观看牌堆顶2张牌并获得其中1张", + forced: true, + filterTarget: (card, player, target) => { + return target != player; + }, + ai: target => { + let player = get.player(); + return get.attitude(player, target); + }, + }) + .forResult(); + const target = result1.targets[0]; + const cards0 = get.cards(2, true); + const result2 = await target + .chooseButton({ + createDialog: [ + "选择一张牌获得", + cards0 + ], + forced: true, + ai: (button) => { + const card = button.link; + let val = get.value(card); + if (!get.tag(card, "damage")) val += 5; + return val; + } + }) + .forResult(); + const card0 = result2.links[0]; + if (!card0) { + return; + } + await target.gain(card0, "draw"); + if (get.tag(card0, "damage")) { + if (player.isIn()) { + let cardsx = []; + while (cardsx.length < 2) { + const card = get.cardPile(i => get.tag(i, "damage") && !cardsx.includes(i)); + if (card) { + cardsx.push(card); + } + else { + break; + } + } + await player.gain(cardsx, "draw"); + } + if (target.isIn()) { + let cardsx = target.getCards("h").randomGets(2); + if (cardsx?.length) { + target.addTempSkill(event.name + "_sha", { global: "roundEnd" }); + target.addGaintag(cardsx, event.name + "_sha"); + } + } + } + else { + if (player.isIn()) { + let cardsx = []; + while (cardsx.length < 2) { + const card = get.cardPile(i => !get.tag(i, "damage") && !cardsx.includes(i)); + if (card) { + cardsx.push(card); + } + else { + break; + } + } + await player.gain(cardsx, "draw"); + player.addSkill(event.name + "_mianshang"); + } + if (target.isIn()) { + target.addTempSkill("dcsbxinzhan", { global: "roundEnd" }); + } + } + } + }, + check: (event, player) => { + return game.hasPlayer(current => { + return current != player && get.attitude(player, target) > 0; + }) + }, + subSkill: { + sha: { + charlotte: true, + mod: { + cardname(card) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcsbchengce_sha")) { + return "sha"; + } + }, + cardnature(card) { + if (get.itemtype(card) == "card" && card.hasGaintag("dcsbchengce_sha")) { + return false; + } + } + }, + trigger: { + global:"roundEnd" + }, + onremove(player, skill) { + player.removeGaintag("dcsbchengce_sha"); + }, + sub: true, + sourceSkill: "dcsbchengce", + }, + mianshang: { + charlotte: true, + forced: true, + trigger: { player: "damageBegin4" }, + async content(event, trigger, player) { + player.removeSkill(event.name); + trigger.cancel(); + }, + mark: true, + intro: { + content: "防止下次受到的伤害", + }, + sub: true, + sourceSkill: "dcsbchengce", + }, + }, + }, //神曹丕 dcyinzhi: { audio: 2, diff --git a/apps/core/character/xianding/sort.js b/apps/core/character/xianding/sort.js index 82e4626cd7..86d5ead48a 100644 --- a/apps/core/character/xianding/sort.js +++ b/apps/core/character/xianding/sort.js @@ -24,9 +24,10 @@ const characterSort = { sp2_youlin: ["dc_sb_hulie", "dc_sb_dengai"], sp2_boyan: ["dc_sb_huangquan", "dc_sb_luotong", "dc_sb_xusheng", "dc_sb_zhuran"], sp2_fengchu: ["dc_sb_zhangren", "dc_sb_liuzhang", "dc_sb_wuyi", "dc_sb_fazheng"], + sp2_wuhou: ["dc_sb_masu", "dc_sb_wangping"], sp2_weizhen: ["v_gongsunzan", "v_zhangliao", "v_lvbu", "v_dongzhuo", "v_machao"], sp2_junwei: ["v_caopi", "v_sunquan", "v_caocao", "v_liubei"], - sp2_pianyu: ["v_zhangxingcai", "v_sunshangxiang"], + sp2_pianyu: ["v_zhangxingcai", "v_sunshangxiang", "v_guanyinping"], sp2_waitingforsort: [], }; @@ -55,6 +56,7 @@ const characterSortTranslate = { sp2_youlin: "幼麟绝战", sp2_boyan: "伯言绽火", sp2_fengchu: "凤雏溯攻", + sp2_wuhou: "武侯定南", sp2_weizhen: "威震天下", sp2_junwei: "君威盖世", sp2_pianyu: "片羽威凤", diff --git a/apps/core/character/xianding/translate.js b/apps/core/character/xianding/translate.js index 8e0c5026f0..96da4a7f25 100644 --- a/apps/core/character/xianding/translate.js +++ b/apps/core/character/xianding/translate.js @@ -1,6 +1,24 @@ import { lib, game, ui, get, ai, _status } from "noname"; const translates = { + v_guanyinping: "威关银屏", + v_guanyinping_prefix: "威", + dcshaowei: "绍威", + dcshaowei_info: "每回合每项限一次:1.你失去♦️牌后,你从牌堆随机获得3张红色牌;2.你失去♥️牌后,你回复1点体力并恢复1个装备栏。", + dcdichou: "涤仇", + dcdichou_info: "锁定技。①其他角色对你使用牌时,其获得1个“仇”标记;②你的回合开始时,你废除1个装备栏并弃置一名有“仇”的角色1张牌,本回合你的攻击范围与使用【杀】的次数上限增加X(X为被弃置的牌名字数);③你对有“仇”的角色使用牌时,你摸1张牌并移去其1个“仇”;④你的回合结束时,你对任意名有“仇”的角色各造成1点火焰伤害并移去其所有“仇”。", + dc_sb_wangping: "新杀谋王平", + dc_sb_wangping_prefix: "新杀谋", + dcsbyouyi: "诱夷", + dcsbyouyi_info: "每回合每项限一次,你成为其他角色使用的伤害牌的目标时,你可令其本阶段使用的【杀】次数上限+1,然后你选择一项执行:1.弃置任意张牌,本回合结束时摸等量张牌;2.失去至多3点体力并令一名角色摸等量张牌,本回合结束时回复因此失去的体力。 ", + dcsbfangong: "返攻", + dcsbfangong_info: "限定技,出牌阶段,你可回满体力值并摸当前手牌数张牌(至多摸5张)。你因“诱夷”失去的体力值和牌数的总和每累计达到7后,此技能视为未发动过。", + dc_sb_masu: "新杀谋马谡", + dc_sb_masu_prefix: "新杀谋", + dcsbchengce: "呈策", + dcsbchengce_info: `每轮开始时,你可以观看牌堆顶2张牌并用任意张手牌替换其中等量牌,然后你令一名其他角色观看牌堆顶2张牌并获得其中1张。若其获得的牌为:非伤害牌,你获得2张非伤害牌并防止下次你受到的伤害,其获得${get.poptip("dcsbxinzhan")}直到本轮结束;伤害牌,你获得2张伤害牌,其随机2张手牌视为【杀】直到本轮结束。`, + dcsbxinzhan: "心战", + dcsbxinzhan_info: "每回合各限一次,你每回合首次使用【杀】或普通锦囊牌指定其他角色为唯一目标时,可猜测此牌是否被响应。此牌结算完成后,若你猜对,你观看目标手牌并获得其1张牌,且你回复1点体力;若你没猜对,你获得1张【杀】并视为对其使用一张【决斗】。", dc_shen_caopi: "新杀神曹丕", dc_shen_caopi_prefix: "新杀|神", dcyinzhi: "阴鸷", From 61d88e2ad88718fdea3b8f2433e74832a0e3b1b8 Mon Sep 17 00:00:00 2001 From: rintim Date: Mon, 29 Jun 2026 22:38:09 +0800 Subject: [PATCH 10/12] =?UTF-8?q?fix:=20=E8=A1=A5=E4=B8=8A=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=86=B2=E7=AA=81=E4=B8=A2=E5=A4=B1=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/xianding/character.js | 18 ++++++++++++++++++ apps/core/character/xianding/characterTitle.js | 3 +++ apps/core/character/xianding/translate.js | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/apps/core/character/xianding/character.js b/apps/core/character/xianding/character.js index 9c1c5168f1..3831ab6ab6 100644 --- a/apps/core/character/xianding/character.js +++ b/apps/core/character/xianding/character.js @@ -1,6 +1,24 @@ import skills from "./skill"; const characters = { + v_guanyinping: { + sex: "female", + group: "shu", + hp: 4, + skills: ["dcshaowei", "dcdichou"], + }, + dc_sb_wangping: { + sex: "male", + group: "shu", + hp: 4, + skills: ["dcsbyouyi", "dcsbfangong"], + }, + dc_sb_masu: { + sex: "male", + group: "shu", + hp: 3, + skills: ["dcsbchengce", "dcsbxinzhan"], + }, dc_shen_caopi: { sex: "male", group: "shen", diff --git a/apps/core/character/xianding/characterTitle.js b/apps/core/character/xianding/characterTitle.js index e088872dcf..750dbc1416 100644 --- a/apps/core/character/xianding/characterTitle.js +++ b/apps/core/character/xianding/characterTitle.js @@ -1,4 +1,7 @@ export default { + //v_guanyinping: "", + //dc_sb_wangping: "", + //dc_sb_masu: "", //dc_shen_caopi: "", //dc_xia_wangyue: "", //shie: "", diff --git a/apps/core/character/xianding/translate.js b/apps/core/character/xianding/translate.js index d28658b1a5..b0e1af12c2 100644 --- a/apps/core/character/xianding/translate.js +++ b/apps/core/character/xianding/translate.js @@ -1,6 +1,24 @@ import { lib, game, ui, get, ai, _status } from "noname"; const translates = { + v_guanyinping: "威关银屏", + v_guanyinping_prefix: "威", + dcshaowei: "绍威", + dcshaowei_info: "每回合每项限一次:1.你失去♦️牌后,你从牌堆随机获得3张红色牌;2.你失去♥️牌后,你回复1点体力并恢复1个装备栏。", + dcdichou: "涤仇", + dcdichou_info: "锁定技。①其他角色对你使用牌时,其获得1个“仇”标记;②你的回合开始时,你废除1个装备栏并弃置一名有“仇”的角色1张牌,本回合你的攻击范围与使用【杀】的次数上限增加X(X为被弃置的牌名字数);③你对有“仇”的角色使用牌时,你摸1张牌并移去其1个“仇”;④你的回合结束时,你对任意名有“仇”的角色各造成1点火焰伤害并移去其所有“仇”。", + dc_sb_wangping: "新杀谋王平", + dc_sb_wangping_prefix: "新杀谋", + dcsbyouyi: "诱夷", + dcsbyouyi_info: "每回合每项限一次,你成为其他角色使用的伤害牌的目标时,你可令其本阶段使用的【杀】次数上限+1,然后你选择一项执行:1.弃置任意张牌,本回合结束时摸等量张牌;2.失去至多3点体力并令一名角色摸等量张牌,本回合结束时回复因此失去的体力。 ", + dcsbfangong: "返攻", + dcsbfangong_info: "限定技,出牌阶段,你可回满体力值并摸当前手牌数张牌(至多摸5张)。你因“诱夷”失去的体力值和牌数的总和每累计达到7后,此技能视为未发动过。", + dc_sb_masu: "新杀谋马谡", + dc_sb_masu_prefix: "新杀谋", + dcsbchengce: "呈策", + dcsbchengce_info: `每轮开始时,你可以观看牌堆顶2张牌并用任意张手牌替换其中等量牌,然后你令一名其他角色观看牌堆顶2张牌并获得其中1张。若其获得的牌为:非伤害牌,你获得2张非伤害牌并防止下次你受到的伤害,其获得${get.poptip("dcsbxinzhan")}直到本轮结束;伤害牌,你获得2张伤害牌,其随机2张手牌视为【杀】直到本轮结束。`, + dcsbxinzhan: "心战", + dcsbxinzhan_info: "每回合各限一次,你每回合首次使用【杀】或普通锦囊牌指定其他角色为唯一目标时,可猜测此牌是否被响应。此牌结算完成后,若你猜对,你观看目标手牌并获得其1张牌,且你回复1点体力;若你没猜对,你获得1张【杀】并视为对其使用一张【决斗】。", dc_shen_caopi: "新杀神曹丕", dc_shen_caopi_prefix: "新杀|神", dcyinzhi: "阴鸷", From cfb37fbfc3ee5455b167b64f15500a0809d5433d Mon Sep 17 00:00:00 2001 From: rintim Date: Mon, 29 Jun 2026 22:40:14 +0800 Subject: [PATCH 11/12] chore: /-/ --- apps/core/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/core/vite.config.ts b/apps/core/vite.config.ts index 0102e5af9f..c9f23f1d8b 100644 --- a/apps/core/vite.config.ts +++ b/apps/core/vite.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; const port = { - client: 8088, + client: 8081, server: 8089, }; From 4186a45f84aeb77d49b6c2d5c1903044a7bb42a9 Mon Sep 17 00:00:00 2001 From: rintim Date: Mon, 29 Jun 2026 22:43:45 +0800 Subject: [PATCH 12/12] =?UTF-8?q?fix:=20=E4=BB=8D=E7=84=B6=E8=A1=A5?= =?UTF-8?q?=E4=B8=8A=E4=B8=A2=E5=A4=B1=E7=9A=84=E4=B8=9C=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/character/xianding/character.js | 32 +++++++++++++++++-- .../core/character/xianding/characterTitle.js | 5 +++ apps/core/character/xianding/translate.js | 28 ++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/apps/core/character/xianding/character.js b/apps/core/character/xianding/character.js index 3831ab6ab6..47edf42651 100644 --- a/apps/core/character/xianding/character.js +++ b/apps/core/character/xianding/character.js @@ -1,5 +1,3 @@ -import skills from "./skill"; - const characters = { v_guanyinping: { sex: "female", @@ -19,6 +17,36 @@ const characters = { hp: 3, skills: ["dcsbchengce", "dcsbxinzhan"], }, + dc_sb_zhugeliang: { + sex: "male", + group: "shu", + hp: 3, + skills: ["dcsbjingmou", "dcsbguyi"], + names: "诸葛|亮", + }, + dc_shen_guanyu: { + sex: "male", + group: "shen", + hp: 4, + maxHp: 5, + skills: ["dcwushen", "dcwuhun"], + groupInGuozhan: "shu", + }, + dc_shen_liubei: { + sex: "male", + group: "shen", + hp: 4, + maxHp: 6, + skills: ["dclongnu", "dcjieying"], + groupInGuozhan: "shu", + }, + dc_shen_zhangliao: { + sex: "male", + group: "shen", + hp: 4, + skills: ["dccuxi", "dcduorui", "dczhiti"], + groupInGuozhan: "wei", + }, dc_shen_caopi: { sex: "male", group: "shen", diff --git a/apps/core/character/xianding/characterTitle.js b/apps/core/character/xianding/characterTitle.js index 750dbc1416..686eaa7c81 100644 --- a/apps/core/character/xianding/characterTitle.js +++ b/apps/core/character/xianding/characterTitle.js @@ -3,6 +3,11 @@ export default { //dc_sb_wangping: "", //dc_sb_masu: "", //dc_shen_caopi: "", + //dc_sb_zhugeliang: "", + dc_shen_guanyu: "鬼神再临", + dc_shen_liubei: "誓守桃园义", + dc_shen_zhangliao: "雁门之刑天", + dc_shen_caopi: "月晦书轮回", //dc_xia_wangyue: "", //shie: "", dc_sb_zhangren: "尖锋致溃", diff --git a/apps/core/character/xianding/translate.js b/apps/core/character/xianding/translate.js index b0e1af12c2..e9bd8d5435 100644 --- a/apps/core/character/xianding/translate.js +++ b/apps/core/character/xianding/translate.js @@ -19,6 +19,34 @@ const translates = { dcsbchengce_info: `每轮开始时,你可以观看牌堆顶2张牌并用任意张手牌替换其中等量牌,然后你令一名其他角色观看牌堆顶2张牌并获得其中1张。若其获得的牌为:非伤害牌,你获得2张非伤害牌并防止下次你受到的伤害,其获得${get.poptip("dcsbxinzhan")}直到本轮结束;伤害牌,你获得2张伤害牌,其随机2张手牌视为【杀】直到本轮结束。`, dcsbxinzhan: "心战", dcsbxinzhan_info: "每回合各限一次,你每回合首次使用【杀】或普通锦囊牌指定其他角色为唯一目标时,可猜测此牌是否被响应。此牌结算完成后,若你猜对,你观看目标手牌并获得其1张牌,且你回复1点体力;若你没猜对,你获得1张【杀】并视为对其使用一张【决斗】。", + dc_sb_zhugeliang: "新杀谋诸葛亮", + dc_sb_zhugeliang_prefix: "新杀谋", + dcsbjingmou: "靖谋", + dcsbjingmou_info: `转换技,①游戏开始时你可自选阴阳状态;②任意角色出牌阶段开始时,若你未有记录的花色或牌类型,你可弃置任意张牌并秘密记录其中包含的至多三种花色与牌类型。有角色使用与你记录的花色或类型相同的牌时,移除该记录。阳:你可令此牌无效并弃置牌堆顶一张牌,若与此牌花色一致对其造成1点火焰伤害;阴:此牌结算后将其交给任意一名角色。若你移除过所有花色与类型,你获得${get.poptip("dcsbdingnan")}。`, + dcsbdingnan: "定南", + dcsbdingnan_info: "出牌阶段限一次,你可令任意名角色依次打出一张【杀】,否则受到1点伤害。", + dcsbguyi: "孤熠", + dcsbguyi_info: "锁定技,分发手牌后,你选择一张手牌并标记为“熠”。每回合限三次,“熠”牌离开手牌区后,观看牌堆顶X张牌选择其中一张牌获得并标记为“熠”,然后以任意顺序放回牌堆顶(X为本轮触发此效果的次数且至多为7),每回合结束时,若你手牌中没有熠牌,摸一张牌并标记为“熠”。", + dc_shen_guanyu: "新杀神关羽", + dc_shen_guanyu_prefix: "新杀|神", + dcwushen: "武神", + dcwushen_info: "锁定技,你的红桃手牌视为【杀】;你使用红桃【杀】无距离和次数限制且不计入次数,且此红桃【杀】造成伤害后,你摸一张牌", + dcwuhun: "武魂", + dcwuhun_info: "锁定技,当你造成/受到1点伤害后,你令受伤角色/来源获得1枚【梦魇】标记;当你死亡时,你令拥有最多该标记的一名其他角色进行判定,若结果不为【桃】或【桃园结义】,则该角色死亡", + dc_shen_liubei: "新杀神刘备", + dc_shen_liubei_prefix: "新杀|神", + dclongnu: "龙怒", + dclongnu_info: "转换技,锁定技,出牌阶段开始时,阳:你失去1点体力并摸等同于你损失体力值张牌,然后本回合你的红色手牌均视为【火杀】(无距离限制);阴:你减1点体力上限并摸等同于你体力值张牌,然后本回合你的锦囊牌均视为【雷杀】(无次数限制且不计入次数限制)。", + dcjieying: "结营", + dcjieying_info: "锁定技,你始终处于横置状态;已横置的角色手牌上限+2;结束阶段,你横置一名其他角色,然后令任意已横置的角色各摸一张牌。", + dc_shen_zhangliao: "新杀神张辽", + dc_shen_zhangliao_prefix: "新杀|神", + dccuxi: "猝袭", + dccuxi_info: "其他角色回合开始时,你可以弃置两张牌,然后令其选择一项:1.由你代替其执行摸牌阶段;2.受到你造成的1点伤害。", + dcduorui: "夺锐", + dcduorui_info: "锁定技,你对其他角色造成伤害时,你可以选择一项:1.废除其一个装备栏直到你的下个出牌阶段开始;2.令其武将牌上的一个技能失效直到你的下个出牌阶段开始。", + dczhiti: "止啼", + dczhiti_info: "锁定技,摸牌阶段你多摸×张牌(×为场上所有被废除的装备栏数);其他角色弃牌阶段结束时,若其有被废除的装备栏,你可弃置其区域内等量张牌。", dc_shen_caopi: "新杀神曹丕", dc_shen_caopi_prefix: "新杀|神", dcyinzhi: "阴鸷",