From 491f61d5009dbc2e0eaa7a3563891811265a5171 Mon Sep 17 00:00:00 2001 From: xizifu <2238983941@qq.com> Date: Wed, 18 Jun 2025 19:24:28 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=B0=8B=E5=88=98?= =?UTF-8?q?=E8=B5=AA=E3=80=90=E6=8E=A0=E5=BD=B1=E3=80=91=E3=80=90=E8=8E=BA?= =?UTF-8?q?=E8=88=9E=E3=80=91=E6=8F=8F=E8=BF=B0=EF=BC=9B=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=9B=B9=E7=86=8A=E3=80=90=E6=97=A0=E4=B8=BA=E3=80=91=E3=80=81?= =?UTF-8?q?diy=E7=BE=8A=E7=A5=9C=E3=80=90=E9=81=BF=E5=8F=AC=E3=80=91?= =?UTF-8?q?=E6=8A=A5=E9=94=99=EF=BC=9B=E8=B0=83=E6=95=B4=E9=82=B4=E5=8E=9F?= =?UTF-8?q?=E5=92=8C=E5=90=84=E7=89=88=E6=9C=AC=E8=BE=9B=E5=AE=AA=E8=8B=B1?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 #2692 #2696 #2699 反馈的问题 --- character/diy/skill.js | 10 +- character/diy/translate.js | 1 - character/sb/skill.js | 36 +- character/sb/translate.js | 4 +- character/sixiang/skill.js | 4 +- character/tw/skill.js | 127 +++---- character/xianding/dynamicTranslate.js | 3 - character/xianding/skill.js | 356 +++++++++--------- character/xianding/translate.js | 3 - character/yijiang/skill.js | 482 ++++++++++++------------- character/yijiang/translate.js | 2 - 11 files changed, 500 insertions(+), 528 deletions(-) diff --git a/character/diy/skill.js b/character/diy/skill.js index c7215da2af..0a43c79063 100644 --- a/character/diy/skill.js +++ b/character/diy/skill.js @@ -2986,16 +2986,14 @@ const skills = { hiddenSkill: true, filter(event, player) { return ( - event.toShow && - event.toShow.some(name => { + event.toShow?.some(name => { return get.character(name, 3).includes("nsbizhao"); - }) && - player != _status.currentPhase + }) && player != _status.currentPhase ); }, async content(event, trigger, player) { - player.addTempSkill(event.nam + "_effect", { player: "phaseBeginStart" }); - player.addMark(event.nam + "_effect", 1, false); + player.addTempSkill(event.name + "_effect", { player: "phaseBeginStart" }); + player.addMark(event.name + "_effect", 1, false); }, subSkill: { effect: { diff --git a/character/diy/translate.js b/character/diy/translate.js index 1d6d443716..0ad15f8a84 100644 --- a/character/diy/translate.js +++ b/character/diy/translate.js @@ -120,7 +120,6 @@ const translates = { nsfuzhou_draw_info: "出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。", ns_yanghu: "羊祜", nsbizhao: "避召", - nsbizhao2: "避召", nsbizhao_info: "隐匿技,锁定技,当你于回合外明置此武将牌后,其他角色计算与你的距离+1直至你的回合开始。", nsqingde: "清德", nsqingde_info: "每回合限一次,当你使用【杀】或普通锦囊牌对其他角色造成伤害后,你可使用该牌与受到伤害的角色拼点。你可令输的角色摸两张牌;当你受到其他角色使用【杀】或普通锦囊牌造成的伤害后,可使用该牌与伤害来源拼点。你可令赢的角色回复1点体力。", diff --git a/character/sb/skill.js b/character/sb/skill.js index 2be12d636e..43e56f1d39 100644 --- a/character/sb/skill.js +++ b/character/sb/skill.js @@ -10063,12 +10063,10 @@ const skills = { filter(event, player) { return event.card.name == "sha" && player.countMark("splveying") > 1; }, - content() { - "step 0"; + async content(event, trigger, player) { player.removeMark("splveying", 2); - player.draw(); - "step 1"; - player.chooseUseTarget("guohe"); + await player.draw(); + await player.chooseUseTarget("guohe"); }, marktext: "椎", intro: { @@ -10082,14 +10080,19 @@ const skills = { audio: "splveying", trigger: { player: "useCardToPlayered" }, forced: true, - usable: 2, filter(event, player) { - return event.card.name == "sha" && player.isPhaseUsing(); + return event.card.name == "sha" && player.isPhaseUsing() && player.countMark("splveying_used") < 2; }, - content() { + async content(event, trigger, player) { player.addMark("splveying", 1); + player.addTempSkill("splveying_used", "phaseUseEnd"); + player.addMark("splveying_used", 1); }, }, + used: { + charlotte: true, + onremove: true, + }, }, }, spyingwu: { @@ -10101,10 +10104,10 @@ const skills = { filter(event, player) { return player.hasSkill("splveying", null, null, false) && get.type(event.card) == "trick" && !get.tag(event.card, "damage") && player.countMark("splveying") > 1; }, - content() { + async content(event, trigger, player) { player.removeMark("splveying", 2); - player.draw(); - player.chooseUseTarget("sha", false); + await player.draw(); + await player.chooseUseTarget("sha", false); }, ai: { combo: "splveying" }, subSkill: { @@ -10113,14 +10116,19 @@ const skills = { trigger: { player: "useCardToPlayered" }, forced: true, locked: false, - usable: 2, filter(event, player) { - return player.hasSkill("splveying") && get.type(event.card) == "trick" && !get.tag(event.card, "damage") && player.isPhaseUsing(); + return player.hasSkill("splveying") && get.type(event.card) == "trick" && !get.tag(event.card, "damage") && player.isPhaseUsing() && player.countMark("spyingwu_used") < 2; }, - content() { + async content(event, trigger, player) { player.addMark("splveying", 1); + player.addTempSkill("spyingwu_used", "phaseUseEnd"); + player.addMark("spyingwu_used", 1); }, }, + used: { + charlotte: true, + onremove: true, + }, }, }, //手杀杨婉 diff --git a/character/sb/translate.js b/character/sb/translate.js index eb0b5855c6..9bd35910a6 100644 --- a/character/sb/translate.js +++ b/character/sb/translate.js @@ -40,9 +40,9 @@ const translates = { spxianchou_info: "当你受到有来源的伤害后,你可选择一名不为伤害来源的其他角色。该角色可以弃置一张牌,然后视为对伤害来源使用一张【杀】(无距离限制)。若其因此【杀】造成了伤害,则其摸一张牌,你回复1点体力。", liucheng: "谋刘赪", splveying: "掠影", - splveying_info: "锁定技。①每回合限两次,当你使用【杀】指定目标后,你获得一个“椎”。②当你使用的【杀】结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【过河拆桥】。", + splveying_info: "锁定技。①出牌阶段限两次,当你使用【杀】指定目标后,你获得一个“椎”。②当你使用的【杀】结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【过河拆桥】。", spyingwu: "莺舞", - spyingwu_info: "若你拥有〖掠影〗,则:①每回合限两次,当你使用非伤害类普通锦囊牌指定目标后,你获得一个“椎”。②当你使用的非伤害类普通锦囊牌结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【杀】。", + spyingwu_info: "若你拥有〖掠影〗,则:①出牌阶段限两次,当你使用非伤害类普通锦囊牌指定目标后,你获得一个“椎”。②当你使用的非伤害类普通锦囊牌结算结束后,若你的“椎”数大于1,则你弃置两个“椎”并摸一张牌,然后可以视为使用一张【杀】。", sb_huangzhong: "谋黄忠", sbliegong: "烈弓", sbliegong_info: "①若你的装备区内没有武器牌,则你手牌区内所有【杀】的属性视为无属性。②当你使用牌时,或成为其他角色使用牌的目标后,你记录此牌的花色。③当你使用【杀】指定唯一目标后,若你〖烈弓②〗的记录不为空,则你可亮出牌堆顶的X张牌(X为你〖烈弓②〗记录过的花色数-1),令此【杀】的伤害值基数+Y(Y为亮出牌中被〖烈弓②〗记录过花色的牌的数量),且目标角色不能使用〖烈弓②〗记录过花色的牌响应此【杀】。此【杀】使用结算结束后,你清除〖烈弓②〗的记录。", diff --git a/character/sixiang/skill.js b/character/sixiang/skill.js index 3af041a867..86748d74fa 100644 --- a/character/sixiang/skill.js +++ b/character/sixiang/skill.js @@ -260,8 +260,8 @@ const skills = { ai2(target) { const card = ui.selected.cards[0], att = get.attitude(get.player(), target), - range = target.getAttackRange(); - cardrange = 1 - (get.info(card, false)?.distance?.attackFrom || 0); + range = target.getAttackRange(), + cardrange = 1 - (get.info(card, false)?.distance?.attackFrom || 0); if (att <= 0 && cardrange > range) { return get.effect(target, { name: "guohe_copy2" }, get.player(), get.player()); } diff --git a/character/tw/skill.js b/character/tw/skill.js index f40e0d1133..7b1f833f10 100644 --- a/character/tw/skill.js +++ b/character/tw/skill.js @@ -7962,13 +7962,18 @@ const skills = { event.result = { bool: bool, targets: targets }; } else { event.result = await player - .chooseTarget(get.prompt(event.skill), "令任意名【承袭】的目标角色也成为" + get.translation(trigger.card) + "的目标", (card, player, target) => { - const trigger = get.event().getTrigger(); - if (!player.getStorage("twchengxi_add").includes(target)) { - return false; - } - return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); - }, [1, player.getStorage("twchengxi_add").length]) + .chooseTarget( + get.prompt(event.skill), + "令任意名【承袭】的目标角色也成为" + get.translation(trigger.card) + "的目标", + (card, player, target) => { + const trigger = get.event().getTrigger(); + if (!player.getStorage("twchengxi_add").includes(target)) { + return false; + } + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); + }, + [1, player.getStorage("twchengxi_add").length] + ) .set("ai", target => { const player = get.player(), trigger = get.event().getTrigger(); @@ -10350,9 +10355,9 @@ const skills = { }, onChooseToUse(event) { if (event.type == "phase" && !game.online) { - var map = {}; + const map = {}; event.player.getHistory("useCard", evt => { - var evtx = evt.getParent("phaseUse"), + const evtx = evt.getParent("phaseUse"), suit = get.suit(evt.card); if (!lib.suit.includes(suit)) { return; @@ -10370,12 +10375,12 @@ const skills = { }, chooseButton: { dialog(event, player) { - var str = get.translation("twbingde_info"), + let str = get.translation("twbingde_info"), str2 = ""; if (event.twbingde_map) { str2 = '
本回合使用牌对应花色数:
'; str2 += '
'; - for (var suit of lib.suit) { + for (const suit of lib.suit) { str2 += get.translation(suit) + ":" + get.cnNumber(event.twbingde_map[suit] || 0) + "张;"; } str2 = str2.slice(0, str2.length - 1) + "
"; @@ -10383,15 +10388,15 @@ const skills = { return ui.create.dialog("###秉德###" + str, str2); }, chooseControl(event, player) { - var list = lib.suit.slice(); + const list = lib.suit.slice(); list.removeArray(player.getStorage("twbingde_clear")); list.push("cancel2"); return list; }, check(event, player) { - var map = event.twbingde_map; - var suit = lib.suit - .filter(i => !player.getStorage("twbingde_clear").includes(i)) + const map = event.twbingde_map; + const suit = lib.suit + .filter(suit => !player.getStorage("twbingde_clear").includes(suit) && player.hasCard(card => get.suit(card) == suit, "he")) .sort((a, b) => { return map[b] - map[a]; })[0]; @@ -10403,21 +10408,19 @@ const skills = { backup(result, player) { return { audio: "twbingde", - filterCard: true, - selectCard: 1, + filterCard: lib.filter.cardDiscardable, position: "he", suit: result.control, check(card) { - var suit = lib.skill.twbingde.suit; + const suit = lib.skill.twbingde_backup.suit; if (get.suit(card) == suit) { return 10 - get.value(card); } return 6 - get.value(card); }, - content() { - "step 0"; - var suit = lib.skill.twbingde_backup.suit, - num = 0; + async content(event, trigger, player) { + const { suit } = get.info(event.name); + let num = 0; player.popup(suit + 2); game.log(player, "选择了", "#y" + suit + 2); player.addTempSkill("twbingde_clear", "phaseUseAfter"); @@ -10431,18 +10434,14 @@ const skills = { num++; }); if (num > 0) { - player.draw(num); + await player.draw(num); } - "step 1"; - if (get.suit(cards[0], player) == lib.skill.twbingde_backup.suit) { + if (get.suit(event.cards[0], player) == suit && player.getStat("skill").twbingde) { delete player.getStat("skill").twbingde; + game.log(player, "重置了", "#g【秉德】"); } }, - ai: { - result: { - player: 1, - }, - }, + ai: { result: { player: 1 } }, }; }, prompt: () => "秉德:弃置一张牌", @@ -10461,43 +10460,33 @@ const skills = { }, twqingtao: { audio: 2, - trigger: { player: "phaseDrawEnd" }, + trigger: { player: ["phaseDrawEnd", "phaseJieshuBegin"] }, filter(event, player) { - return player.countCards("he"); - }, - direct: true, - group: "twqingtao_jieshu", - content() { - "step 0"; - player.chooseCard(get.prompt2("twqingtao"), "he", lib.filter.cardRecastable).set("ai", function (card) { - if (card.name == "jiu" || get.type(card) != "basic") { - return 10 - get.value(card); - } - return 6 - get.value(card); - }); - "step 1"; - if (result.bool) { - player.logSkill("twqingtao"); - player.recast(result.cards); - if (get.name(result.cards[0]) == "jiu" || get.type(result.cards[0], false, player) != "basic") { - player.draw(); - } + if (!player.countCards("he")) { + return false; } + return event.name == "phaseDraw" || !player.hasHistory("custom", evt => evt.twqingtao); }, - subSkill: { - jieshu: { - audio: "twqingtao", - trigger: { player: "phaseJieshuBegin" }, - filter(event, player) { - return player.countCards("he") > 0 && !player.hasHistory("useSkill", evt => evt.skill == "twqingtao"); - }, - direct: true, - content() { - var next = game.createEvent("twqingtao"); - next.player = player; - next.setContent(lib.skill.twqingtao.content); - }, - }, + async cost(event, trigger, player) { + event.result = await player + .chooseCard(get.prompt2(event.skill), "he", lib.filter.cardRecastable) + .set("ai", function (card) { + if (card.name == "jiu" || get.type(card) != "basic") { + return 10 - get.value(card); + } + return 6 - get.value(card); + }) + .forResult(); + }, + async content(event, trigger, player) { + const { cards } = event; + await player.recast(cards); + if (trigger.name == "phaseDraw") { + player.getHistory("custom").push({ [event.name]: true }); + } + if (get.name(cards[0]) == "jiu" || get.type(cards[0], false, player) != "basic") { + await player.draw(); + } }, }, //牛董 @@ -11616,11 +11605,7 @@ const skills = { if (trigger.player != player) { player.addExpose(0.3); } - let choiceList = [ - `令${name}获得牌堆里的一张【杀】`, - `令${name}将一张手牌交给另一名角色,然后${name}摸两张牌`, - `背水!${(target != player ? "将所有手牌交给" + name + ",然后" : "")}依次执行以上所有选项`, - ]; + let choiceList = [`令${name}获得牌堆里的一张【杀】`, `令${name}将一张手牌交给另一名角色,然后${name}摸两张牌`, `背水!${target != player ? "将所有手牌交给" + name + ",然后" : ""}依次执行以上所有选项`]; let list = ["选项一"]; if (target.countCards("h") && game.hasPlayer(t => t !== target)) { list.push("选项二"); @@ -11632,7 +11617,9 @@ const skills = { } else { choiceList[2] = '' + choiceList[2] + ""; } - const { result: { control }} = await player + const { + result: { control }, + } = await player .chooseControl(list) .set("prompt", "毅谋:请选择一项") .set("choiceList", choiceList) diff --git a/character/xianding/dynamicTranslate.js b/character/xianding/dynamicTranslate.js index 7db014ef63..013f1ca632 100644 --- a/character/xianding/dynamicTranslate.js +++ b/character/xianding/dynamicTranslate.js @@ -82,9 +82,6 @@ const dynamicTranslates = { } return str; }, - rezhongjian(player) { - return "出牌阶段限" + (player.hasSkill("recaishi2") ? "两" : "一") + "次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。"; - }, bazhan(player) { const bool = player.storage.bazhan; let yang = "你可以将至多两张手牌交给一名其他角色", diff --git a/character/xianding/skill.js b/character/xianding/skill.js index 06143a2076..7c5f725580 100644 --- a/character/xianding/skill.js +++ b/character/xianding/skill.js @@ -21,69 +21,73 @@ const skills = { audio: 2, async cost(event, trigger, player) { const name = trigger.name.slice(5); - event.result = name == "Draw" ? await player - .chooseBool(get.prompt(event.skill)) - .set("prompt2", "摸体力上限张牌") - .forResult() : name == "Use" ? await player - .chooseTarget(get.prompt(event.skill)) - .set("prompt2", "失去1点体力并视为对一名角色使用一张【杀】") - .set("filterTarget", (event, player, target) => { - const card = new lib.element.VCard({ name: "sha" }); - return player.canUse(card, target, false); - }) - .set("ai", target => { - const card = new lib.element.VCard({ name: "sha" }), - player = get.player(), - eff1 = get.effect(target, card, player, player), - eff2 = get.effect(player, { name: "losehp" }, player, player); - return Math.max(0, eff1 - eff2); - }) - .forResult() : await player - .chooseCardTarget({ - filterCard(card, player) { - const num = get.event("numx"); - return num > 0 && lib.filter.cardDiscardable(card, player, "dcjuanji"); - }, - prompt: get.prompt(event.skill), - prompt2: "将手牌调整至手牌上限,然后弃置一名角色区域里至多两张牌", - numx: player.countCards("h") - player.getHandcardLimit(), - selectCard() { - const num = get.event("numx"); - if (num > 0) { - return num; - } - return -1; - }, - filterTarget(card, player, target) { - return player == target || target.countCards("hej"); - }, - ai1(card) { - return 10 - get.value(card); - }, - ai2(target) { - const player = get.player(); - return get.effect(target, { name: "guohe" }, player, player); - }, - }) - .forResult(); + event.result = + name == "Draw" + ? await player.chooseBool(get.prompt(event.skill)).set("prompt2", "摸体力上限张牌").forResult() + : name == "Use" + ? await player + .chooseTarget(get.prompt(event.skill)) + .set("prompt2", "失去1点体力并视为对一名角色使用一张【杀】") + .set("filterTarget", (event, player, target) => { + const card = new lib.element.VCard({ name: "sha" }); + return player.canUse(card, target, false); + }) + .set("ai", target => { + const card = new lib.element.VCard({ name: "sha" }), + player = get.player(), + eff1 = get.effect(target, card, player, player), + eff2 = get.effect(player, { name: "losehp" }, player, player); + return Math.max(0, eff1 - eff2); + }) + .forResult() + : await player + .chooseCardTarget({ + filterCard(card, player) { + const num = get.event("numx"); + return num > 0 && lib.filter.cardDiscardable(card, player, "dcjuanji"); + }, + prompt: get.prompt(event.skill), + prompt2: "将手牌调整至手牌上限,然后弃置一名角色区域里至多两张牌", + numx: player.countCards("h") - player.getHandcardLimit(), + selectCard() { + const num = get.event("numx"); + if (num > 0) { + return num; + } + return -1; + }, + filterTarget(card, player, target) { + return player == target || target.countCards("hej"); + }, + ai1(card) { + return 10 - get.value(card); + }, + ai2(target) { + const player = get.player(); + return get.effect(target, { name: "guohe" }, player, player); + }, + }) + .forResult(); }, async content(event, trigger, player) { const name = trigger.name.slice(5); if (name == "Draw") { await player.draw(player.maxHp); - } - else if (name == "Use") { - const { targets: [target] } = event; + } else if (name == "Use") { + const { + targets: [target], + } = event; const card = new lib.element.VCard({ name: "sha" }); await player.loseHp(); await player.useCard(card, target, false); - } - else { - const { cards, targets: [target] } = event; + } else { + const { + cards, + targets: [target], + } = event; if (cards?.length) { await player.discard(cards); - } - else { + } else { await player.drawTo(player.getHandcardLimit()); } if (target.countCards("hej")) { @@ -113,8 +117,7 @@ const skills = { }); await player.gainMaxHp(); } - } - else { + } else { await player.link(false); await player.turnOver(false); const cards = get.inpileVCardList(info => info[0] == "trick" && player.hasUseTarget(info[2])); @@ -25532,39 +25535,38 @@ const skills = { rezhongjian: { enable: "phaseUse", audio: "zhongjian", - usable: 2, + usable(skill, player) { + return 1 + (player.hasSkill(skill + "_rewrite", null, null, false) ? 1 : 0); + }, filter(event, player) { - if (player.getStat().skill.rezhongjian && !player.hasSkill("recaishi2")) { - return false; - } - return game.hasPlayer(function (current) { - return lib.skill.rezhongjian.filterTarget(null, player, current); - }); + return game.hasPlayer(current => lib.skill.rezhongjian.filterTarget(null, player, current)); }, filterTarget(card, player, target) { - if (!player.storage.rezhongjian2) { + if (!player.storage.rezhongjian_effect) { return true; } - return !player.storage.rezhongjian2[0].includes(target) && !player.storage.rezhongjian2[1].includes(target); + return !player.storage.rezhongjian_effect[0]?.includes(target) && !player.storage.rezhongjian_effect[1]?.includes(target); }, line: false, log: "notarget", - content() { - "step 0"; - player + async content(event, trigger, player) { + const { target } = event; + const { result } = await player .chooseControl() .set("prompt", "忠鉴:为" + get.translation(target) + "选择获得一项效果") .set("choiceList", ["令其于下回合开始前首次造成伤害后弃置两张牌", "令其于下回合开始前首次受到伤害后摸两张牌"]) - .set("ai", function () { - return get.attitude(_status.event.player, _status.event.getParent().target) > 0 ? 1 : 0; + .set("ai", () => { + const player = get.player(); + const { target } = get.event().getParent(); + return get.attitude(player, target) > 0 ? 1 : 0; }); - "step 1"; - player.addTempSkill("rezhongjian2", { player: "phaseBeginStart" }); - //var str=['造成伤害弃牌','受到伤害摸牌'][result.index]; - //player.popup(str,['fire','wood'][result.index]); - //game.log(player,'选择了','#y'+str) - player.storage.rezhongjian2[result.index].push(target); - player.markSkill("rezhongjian2"); + if (typeof result?.index !== "number") { + return; + } + const skill = `${event.name}_effect`; + player.addTempSkill(skill, { player: "phaseBeginStart" }); + player.storage[skill][result.index].push(target); + player.markSkill(skill); }, ai: { order: 10, @@ -25589,66 +25591,68 @@ const skills = { }, }, }, - }, - rezhongjian2: { - trigger: { - global: ["damageSource", "damageEnd"], - }, - forced: true, - sourceSkill: "rezhongjian", - filter(event, player, name) { - var num = name == "damageSource" ? 0 : 1; - var logTarget = name == "damageSource" ? event.source : event.player; - return logTarget && logTarget.isIn() && player.storage.rezhongjian2[num].includes(logTarget); - }, - logTarget(event, player, name) { - return name == "damageSource" ? event.source : event.player; - }, - content() { - var num = event.triggername == "damageSource" ? 0 : 1; - var target = event.triggername == "damageSource" ? trigger.source : trigger.player; - var storage = player.storage.rezhongjian2; - storage[num].remove(target); - if (storage[0].length + storage[1].length) { - player.markSkill("rezhongjian2"); - } else { - player.removeSkill("rezhongjian2"); - } - target[event.triggername == "damageSource" ? "chooseToDiscard" : "draw"](2, true, "he"); - player.draw(); - }, - init(player, skill) { - if (!player.storage[skill]) { - player.storage[skill] = [[], []]; - } - }, - onremove: true, - intro: { - markcount(storage) { - return storage[0].length + storage[1].length; - }, - mark(dialog, storage, player) { - if (player == game.me || player.isUnderControl()) { - if (storage[0].length) { - dialog.addText("弃牌"); - dialog.add([storage[0], "player"]); - } - if (storage[1].length) { - dialog.addText("摸牌"); - dialog.add([storage[1], "player"]); + subSkill: { + rewrite: { charlotte: true }, + effect: { + init(player, skill) { + player.storage[skill] ??= [[], []]; + }, + charlotte: true, + onremove: true, + trigger: { global: ["damageSource", "damageEnd"] }, + filter(event, player, name) { + const index = name == "damageSource" ? 0 : 1; + const target = name == "damageSource" ? event.source : event.player; + return target?.isIn() && player.storage["rezhongjian_effect"][index].includes(target); + }, + forced: true, + logTarget(event, player, name) { + return name == "damageSource" ? event.source : event.player; + }, + async content(event, trigger, player) { + const [target] = event.targets; + const index = event.triggername == "damageSource" ? 0 : 1; + const storage = player.storage[event.name]; + storage[index].remove(target); + if (storage[0].length + storage[1].length) { + player.markSkill(event.name); + } else { + player.removeSkill(event.name); } - } else { - dialog.addText(get.translation(player) + "共选择了" + get.cnNumber(storage[0].length + storage[1].length) + "人"); - } + await target[event.triggername == "damageSource" ? "chooseToDiscard" : "draw"](2, true, "he"); + await player.draw(); + }, + intro: { + markcount(storage) { + if (!storage) { + return 0; + } + return storage[0].length + storage[1].length; + }, + mark(dialog, storage, player) { + if (!storage) { + return "尚未选择"; + } + if (player == game.me || player.isUnderControl()) { + if (storage?.[0]?.length) { + dialog.addText("弃牌"); + dialog.add([storage[0], "player"]); + } + if (storage?.[1]?.length) { + dialog.addText("摸牌"); + dialog.add([storage[1], "player"]); + } + } else { + dialog.addText(`${get.translation(player)}共选择了${get.cnNumber(storage[0].length + storage[1].length)} 人`); + } + }, + }, }, }, }, recaishi: { - trigger: { player: "phaseDrawEnd" }, - direct: true, - audio: "caishi", isSame(event) { - var cards = []; + const cards = []; event.player.getHistory("gain", function (evt) { if (evt.getParent().name == "draw" && evt.getParent("phaseDraw") == event) { cards.addArray(evt.cards); @@ -25657,10 +25661,7 @@ const skills = { if (!cards.length) { return "nogain"; } - var list = []; - for (var i = 0; i < cards.length; i++) { - list.add(get.suit(cards[i])); - } + const list = cards.map(card => get.suit(card)).toUniqued(); if (list.length == 1) { return true; } @@ -25669,54 +25670,67 @@ const skills = { } return "nogain"; }, + audio: "caishi", + trigger: { player: "phaseDrawEnd" }, filter(event, player) { - var isSame = lib.skill.recaishi.isSame(event); + const isSame = lib.skill.recaishi.isSame(event); if (isSame == "nogain") { return false; } return isSame || player.isDamaged(); }, - content() { - "step 0"; - if (lib.skill.recaishi.isSame(trigger)) { - player.logSkill("recaishi"); - player.addTempSkill("recaishi2"); - event.finish(); - return; + async cost(event, trigger, player) { + const isSame = lib.skill.recaishi.isSame(trigger); + if (isSame) { + event.result = { + bool: true, + cost_data: "rewrite", + }; + } else if (player.isDamaged()) { + event.result = await player + .chooseBool(get.prompt(event.skill), "回复1点体力,然后本回合内不能对自己使用牌") + .set( + "choice", + (() => { + if (player.countCards("h", "tao")) { + return false; + } + if (player.hp < 2) { + return true; + } + return ( + player.countCards("h", card => { + const info = get.info(card); + return info && (info.toself || info.selectTarget == -1) && player.canUse(card, player) && player.getUseValue(card) > 0; + }) == 0 + ); + })() + ) + .forResult(); } - player.chooseBool(get.prompt("recaishi"), "回复1点体力,然后本回合内不能对自己使用牌").set("ai", function () { - if (player.countCards("h", "tao")) { - return false; - } - if (player.hp < 2) { - return true; - } - return ( - player.countCards("h", function (card) { - var info = get.info(card); - return info && (info.toself || info.selectTarget == -1) && player.canUse(card, player) && player.getUseValue(card) > 0; - }) == 0 - ); - }); - "step 1"; - if (result.bool) { - player.logSkill("recaishi"); - player.recover(); - player.addTempSkill("recaishi3"); + }, + async content(event, trigger, player) { + if (event.cost_data === "rewrite") { + player.addTempSkill("rezhongjian_rewrite"); + } else { + await player.recover(); + player.addTempSkill(event.name + "_effect"); } }, - }, - recaishi2: {}, - recaishi3: { - mod: { - targetEnabled(card, player, target) { - if (player == target) { - return false; - } + subSkill: { + effect: { + charlotte: true, + mark: true, + intro: { content: "本回合内不能对自己使用牌" }, + mod: { + targetEnabled(card, player, target) { + if (player == target) { + return false; + } + }, + }, }, }, - mark: true, - intro: { content: "本回合内不能对自己使用牌" }, }, //刘辩 shiyuan: { diff --git a/character/xianding/translate.js b/character/xianding/translate.js index 25fa713e70..93290ec6d7 100644 --- a/character/xianding/translate.js +++ b/character/xianding/translate.js @@ -84,14 +84,11 @@ const translates = { re_xinxianying: "新杀辛宪英", re_xinxianying_prefix: "新杀", rezhongjian: "忠鉴", - rezhongjian2: "忠鉴", rezhongjian_info: "出牌阶段限一次,你可以选择一名本回合内未选择过的角色(其他角色不可见)。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。", recaishi: "才识", - recaishi3: "才识", recaishi_info: "摸牌阶段结束时,若你于本阶段内因摸牌而获得的所有的牌:花色均相同,你将〖忠鉴〗于本回合内改为“出牌阶段限两次”。不均相同,你可回复1点体力。若如此做,你本回合内不能对自己使用牌。", guozhao: "郭照", pianchong: "偏宠", - pianchong2: "偏宠", pianchong_info: "摸牌阶段开始时,你可放弃摸牌。若如此做,你从牌堆中获得一张红色牌和一张黑色牌。然后你选择一种颜色。你的下回合开始前,当你失去该颜色的一张牌后,你从牌堆中获得另一种颜色的一张牌。", zunwei: "尊位", zunwei_backup: "尊位", diff --git a/character/yijiang/skill.js b/character/yijiang/skill.js index 0b25f5ad8e..17545d35cf 100644 --- a/character/yijiang/skill.js +++ b/character/yijiang/skill.js @@ -781,17 +781,17 @@ const skills = { var todis = source.countCards("h") - source.needsToDiscard(); if ( todis <= - Math.max( - Math.min( - 2 + (source.hp <= 1 ? 1 : 0), - player.countCards("he", function (card) { - return get.value(card, player) < Math.max(5.5, 8 - todis); - }) - ), + Math.max( + Math.min( + 2 + (source.hp <= 1 ? 1 : 0), player.countCards("he", function (card) { - return get.value(card, player) <= 0; + return get.value(card, player) < Math.max(5.5, 8 - todis); }) - ) && + ), + player.countCards("he", function (card) { + return get.value(card, player) <= 0; + }) + ) && get.damageEffect(source, player, player) > 0 ) { return false; @@ -1123,21 +1123,21 @@ const skills = { var func = function (player) { game.countPlayer(function (target) { var list = ["摸牌", "弃牌", "制衡"].filter(function (control) { - var storage = player.getStorage("xinyaoming_used"); - if (storage.includes(control)) { - return false; - } - if (control == "摸牌" && target != player) { - return true; - } - if (control == "弃牌" && target != player && target.countCards("h")) { - return true; - } - if (control == "制衡") { - return true; - } + var storage = player.getStorage("xinyaoming_used"); + if (storage.includes(control)) { return false; - }), + } + if (control == "摸牌" && target != player) { + return true; + } + if (control == "弃牌" && target != player && target.countCards("h")) { + return true; + } + if (control == "制衡") { + return true; + } + return false; + }), str = ""; for (var i of list) { str += i + "
"; @@ -1318,9 +1318,9 @@ const skills = { async content(event, trigger, player) { const result = player.storage.xinfuli ? await player - .chooseBool("是否失去1点体力并获得一张【杀】?") - .set("choice", player.hp > 2 && !player.hasSha()) - .forResult() + .chooseBool("是否失去1点体力并获得一张【杀】?") + .set("choice", player.hp > 2 && !player.hasSha()) + .forResult() : { bool: true }; if (!result?.bool) { return; @@ -1666,49 +1666,49 @@ const skills = { }, xintaoluan_backup: {}, xincaishi: { - trigger: { - player: "phaseDrawBegin2", - }, audio: "caishi", - direct: true, - content() { - "step 0"; - var choiceList = ["手牌上限-1且发动【忠鉴】时可以多展示对方的一张牌"]; - if (!trigger.numFixed) { - choiceList.push("摸牌阶段多摸两张牌,然后本回合内不能发动【忠鉴】"); - if (trigger.num > 0) { - choiceList.unshift("摸牌阶段少摸一张牌,发动【忠鉴】时可以多展示自己的一张牌直到回合结束"); - event.first = true; - } + trigger: { player: "phaseDrawBegin2" }, + async cost(event, trigger, player) { + const choices = []; + const choiceList = ["少摸一张牌,本回合发动〖忠鉴〗时可以多展示自己的一张牌", "手牌上限-1且本回合发动〖忠鉴〗时可以多展示对方的一张牌", "多摸两张牌,然后本回合内不能发动〖忠鉴〗"]; + if (!trigger.numFixed && trigger.num > 0) { + choices.push("选项一"); + } else { + choiceList[0] = '' + choiceList[0] + ""; } - var next = player.chooseControl("cancel2"); - next.set("choiceList", choiceList); - next.set("prompt", get.prompt("xincaishi")); - next.set("ai", function () { - return 2; - }); - "step 1"; - if (result.control != "cancel2") { - player.logSkill("xincaishi"); - if (!event.first) { - result.index++; - } - trigger.num += result.index > 1 ? 2 : result.index - 1; - player.addTempSkill("xincaishi_" + result.index); + choices.push("选项二"); + if (!trigger.numFixed) { + choices.push("选项三"); + } else { + choiceList[2] = '' + choiceList[2] + ""; } + const { result } = await player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt(event.skill)) + .set("ai", () => { + return 2; + }); + event.result = { + bool: result?.control !== "cancel2", + cost_data: result?.index, + }; + }, + async content(event, trigger, player) { + const index = event.cost_data; + trigger.num += index > 1 ? 2 : index - 1; + player.addTempSkill(`${event.name}_${index}`); }, subSkill: { 0: { + charlotte: true, mark: true, - intro: { - content: "发动【忠鉴】时可以多展示自己的一张牌", - }, + intro: { content: "本回合发动〖忠鉴〗时可以多展示自己的一张牌" }, }, 1: { + charlotte: true, mark: true, - intro: { - content: "发动【忠鉴】时可以多展示目标角色的一张牌", - }, + intro: { content: "本回合发动〖忠鉴〗时可以多展示目标角色的一张牌" }, mod: { maxHandcard(player, num) { return num - 1; @@ -1716,10 +1716,9 @@ const skills = { }, }, 2: { + charlotte: true, mark: true, - intro: { - content: "不能发动【忠鉴】直到回合结束", - }, + intro: { content: "本回合不能发动〖忠鉴〗" }, }, }, }, @@ -1735,46 +1734,41 @@ const skills = { }, filterCard: true, selectCard() { - return _status.event.player.hasSkill("xincaishi_0") ? [1, 2] : [1, 1]; + return get.player().hasSkill("xincaishi_0") ? [1, 2] : [1, 1]; }, check() { return 1; }, discard: false, lose: false, - content() { - "step 0"; - event.suits = []; - event.nums = []; - for (var i = 0; i < cards.length; i++) { - event.suits.push(get.suit(cards[i])); - event.nums.push(get.number(cards[i])); - } - player.showCards(cards); - "step 1"; - player.choosePlayerCard(target, "h", [1, player.hasSkill("xincaishi_1") ? 4 : 3], "请选择要展示的牌", true).ai = function () { - return Math.random(); - }; - "step 2"; - event.cards2 = result.cards.slice(0); - target.showCards(event.cards2); - "step 3"; - var card = event.cards2.shift(); - var bool = false; - if (event.suits.includes(get.suit(card))) { - bool = true; - player.draw(); - } - if (event.nums.includes(get.number(card))) { - bool = true; - target.damage("nocard"); + async content(event, trigger, player) { + const { cards, target } = event; + const suits = cards.map(card => get.suit(card)).toUniqued(); + const numbers = cards.map(card => get.number(card)).toUniqued(); + await player.showCards(cards); + if (!target.countCards("h")) { + return; } - if (!bool && player.countCards("h")) { - player.chooseToDiscard("h", true); + const { result } = await player.choosePlayerCard(target, "h", [1, player.hasSkill("xincaishi_1") ? 4 : 3], `请选择${get.translation(target)}要展示的牌`, true); + if (!result?.cards?.length) { + return; } - "step 4"; - if (event.cards2.length) { - event.goto(3); + const cards2 = result.cards.slice(0); + await target.showCards(cards2); + while (cards2.length) { + const card = cards2.shift(); + let bool = false; + if (suits.includes(get.suit(card))) { + bool = true; + await player.draw(); + } + if (numbers.includes(get.number(card))) { + bool = true; + await target.damage("nocard"); + } + if (!bool && player.countDiscardableCards(player, "h")) { + await player.chooseToDiscard("h", true); + } } }, ai: { @@ -4080,17 +4074,14 @@ const skills = { zhongjian: { audio: 2, enable: "phaseUse", - usable: 2, + usable(skill, player) { + return 1 + (player.hasSkill(skill + "_rewrite", null, null, false) ? 1 : 0); + }, filter(event, player) { if (!player.countCards("h")) { return false; } - if (player.getStat("skill").zhongjian && !player.hasSkill("zhongjian2")) { - return false; - } - return game.hasPlayer(function (current) { - return current != player && Math.min(current.hp, current.countCards("h")) > 0; - }); + return game.hasPlayer(current => current != player && Math.min(current.hp, current.countCards("h")) > 0); }, filterCard: true, check() { @@ -4102,79 +4093,53 @@ const skills = { filterTarget(card, player, target) { return target != player && target.hp > 0 && target.countCards("h") > 0; }, - content() { - "step 0"; - player.showCards(cards); - "step 1"; - player.choosePlayerCard(target, "h", Math.min(target.countCards("h"), target.hp), true); - "step 2"; - var hs = result.cards; - target.showCards(hs); - var colors = []; - var numbers = []; - for (var i = 0; i < cards.length; i++) { - colors.add(get.color(cards[i])); - numbers.add(get.number(cards[i])); + async content(event, trigger, player) { + const { cards, target } = event; + await player.showCards(cards); + if (Math.min(target.hp, target.countCards("h")) <= 0) { + return; } - event.bool1 = false; - event.bool2 = false; - for (var i = 0; i < hs.length; i++) { - if (!event.bool1 && colors.includes(get.color(hs[i]))) { - event.bool1 = true; - } - if (!event.bool2 && numbers.includes(get.number(hs[i]))) { - event.bool2 = true; - } + const { result } = await player.choosePlayerCard(target, "h", Math.min(target.countCards("h"), target.hp), true); + if (!result?.cards?.length) { + return; } - "step 3"; - if (event.bool1) { - var filterTarget = function (card, player, target) { - return target != player && target.countDiscardableCards(player, "he") > 0; - }; - if ( - !game.hasPlayer(function (current) { - return filterTarget(null, player, current); - }) - ) { - event._result = { bool: false }; - } else { - player.chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌").set("ai", function (target) { - var att = get.attitude(player, target); - if (att >= 0) { + const hs = result.cards; + await target.showCards(hs); + const bool1 = cards.some(card => hs.some(cardx => get.color(cardx) == get.color(card))); + const bool2 = cards.some(card => hs.some(cardx => get.number(cardx) == get.number(card))); + if (bool1) { + const result = !game.hasPlayer(current => current != player && current.countDiscardableCards(player, "he")) + ? { bool: false } + : await player + .chooseTarget((card, player, target) => { + return target != player && target.countDiscardableCards(player, "he"); + }, "弃置一名其他角色的一张牌或摸一张牌") + .set("ai", target => { + const player = get.player(); + const att = get.attitude(player, target); + if (att >= 0) { + return 0; + } + if (target.countCards("he", card => get.value(card) > 5)) { + return -att; + } return 0; - } - if ( - target.countCards("he", function (card) { - return get.value(card) > 5; - }) - ) { - return -att; - } - return 0; - }); + }) + .forResult(); + if (result?.targets?.length) { + const [target] = result.targets; + player.line(target, "green"); + await player.discardPlayerCard(target, true, "he"); + } else { + await player.draw(); } - } else { - event.goto(5); - } - "step 4"; - if (!result.bool) { - player.draw(); - } else { - var target = result.targets[0]; - player.line(target, "green"); - player.discardPlayerCard(target, true, "he"); } - "step 5"; - if (event.bool2) { - player.addTempSkill("zhongjian2"); + if (bool2) { + player.addTempSkill(event.name + "_rewrite", "phaseUseEnd"); } - if (!event.bool1 && !event.bool2) { - player.addSkill("caishix"); - if (typeof player.storage.caishix != "number") { - player.storage.caishix = 0; - } - player.storage.caishix--; - player.markSkill("caishix"); + if (!bool1 && !bool2) { + player.addSkill(event.name + "_effect"); + player.addMark(event.name + "_effect", 1, false); player.popup("杯具"); } }, @@ -4186,91 +4151,100 @@ const skills = { }, }, }, + subSkill: { + rewrite: { charlotte: true }, + effect: { + charlotte: true, + onremove: true, + markimage: "image/card/handcard.png", + intro: { content: "手牌上限-#" }, + mod: { + maxHandcard(player, num) { + return num - player.countMark("zhongjian_effect"); + }, + }, + }, + }, }, - zhongjian2: {}, caishi: { audio: 2, trigger: { player: "phaseDrawBegin" }, - direct: true, - content() { - "step 0"; - if (player.isHealthy()) { - event.type = 0; - player.chooseBool(get.prompt("caishi"), "令自己的手牌上限+1", function () { - return true; - }); - } else { - event.type = 1; - player.chooseControlList(get.prompt("caishi"), "令自己的手牌上限+1", "回复1点体力,然后本回合你的牌不能对自己使用", function () { - return 1; - }); - } - "step 1"; - if (event.type) { - if (result.control != "cancel2") { - player.logSkill("caishi"); - if (result.index == 0) { - player.addSkill("caishix"); - if (typeof player.storage.caishix != "number") { - player.storage.caishix = 0; + async cost(event, trigger, player) { + const choices = []; + const choiceList = ["令自己的手牌上限+1", "回复1点体力,然后本回合你不能对自己使用牌"]; + choices.push("选项一"); + if (player.isDamaged()) { + choices.push("选项二"); + } else { + choiceList[1] = '' + choiceList[1] + ""; + } + const { result } = await player + .chooseControl(choices, "cancel2") + .set("choiceList", choiceList) + .set("prompt", get.prompt(event.skill)) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (() => { + if (player.isDamaged()) { + if (player.countCards("h", "tao")) { + return 0; + } + if (player.hp < 2) { + return 1; + } + if ( + player.countCards("h", card => { + const info = get.info(card); + return info && (info.toself || info.selectTarget == -1) && player.canUse(card, player) && player.getUseValue(card) > 0; + }) == 0 + ) { + return 1; + } } - player.storage.caishix++; - player.markSkill("caishix"); - } else if (result.index == 1) { - player.recover(); - player.addTempSkill("caishi3"); - } - } - } else { - if (result.bool) { - player.logSkill("caishi"); - player.addSkill("caishix"); - if (typeof player.storage.caishix != "number") { - player.storage.caishix = 0; - } - player.storage.caishix++; - player.markSkill("caishix"); - } - } - }, - }, - caishix: { - intro: { - content(storage) { - if (storage > 0) { - return "手牌上限+" + storage; - } - if (storage < 0) { - return "手牌上限" + storage; - } - return "手牌上限无变化"; - }, + return 0; + })() + ); + event.result = { + bool: result?.control !== "cancel2", + cost_data: result?.index, + }; }, - mod: { - maxHandcard(player, num) { - if (typeof player.storage.caishix == "number") { - return num + player.storage.caishix; - } - }, + async content(event, trigger, player) { + const index = event.cost_data; + if (index == 0) { + player.addSkill(event.name + "_effect"); + player.addMark(event.name + "_effect", 1, false); + } else if (index == 1) { + await player.recover(); + player.addTempSkill(event.name + "_buff"); + } }, - charlotte: true, - onremove: true, - }, - caishi2: { - mod: { - playerEnabled(card, player, target) { - if (player != target) { - return false; - } + subSkill: { + effect: { + charlotte: true, + onremove: true, + markimage: "image/card/handcard.png", + intro: { content: "手牌上限+#" }, + mod: { + maxHandcard(player, num) { + return num + player.countMark("caishi_effect"); + }, + }, }, - }, - }, - caishi3: { - mod: { - playerEnabled(card, player, target) { - if (player == target) { - return false; - } + buff: { + charlotte: true, + mark: true, + intro: { content: "本回合内不能对自己使用牌" }, + mod: { + playerEnabled(card, player, target) { + if (player == target) { + return false; + } + }, + }, }, }, }, @@ -6155,7 +6129,7 @@ const skills = { filter(event, player) { return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "jiu"; }, - content() {}, + content() { }, }, xinxianzhen: { audio: "xianzhen", @@ -6866,7 +6840,7 @@ const skills = { filter(event, player) { return player.isPhaseUsing(); }, - content() {}, + content() { }, mod: { globalFrom(from, to, distance) { if (_status.currentPhase == from) { @@ -7888,7 +7862,7 @@ const skills = { filter(event, player) { return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "shan"; }, - content() {}, + content() { }, }, wurong: { audio: 2, @@ -10962,9 +10936,9 @@ const skills = { return [ 1, 0.6 * - game.countPlayer(cur => { - return (cur.hasSkill("faen") || cur.hasSkill("oldfaen") || cur.hasSkill("refaen") || cur.hasSkill("dcfaen")) && get.attitude(target, cur) > 0; - }), + game.countPlayer(cur => { + return (cur.hasSkill("faen") || cur.hasSkill("oldfaen") || cur.hasSkill("refaen") || cur.hasSkill("dcfaen")) && get.attitude(target, cur) > 0; + }), ]; } }, @@ -12215,9 +12189,9 @@ const skills = { event._forcing = false; event.aicheck = (function () { let res = { - bool: true, - cards: [], - }, + bool: true, + cards: [], + }, cards = player.getCards("he"), tars = game.filterPlayer(i => player !== i); cards.forEach(i => { diff --git a/character/yijiang/translate.js b/character/yijiang/translate.js index c9f6674eef..d229e404c9 100644 --- a/character/yijiang/translate.js +++ b/character/yijiang/translate.js @@ -151,8 +151,6 @@ const translates = { xinzhongjian_info: "出牌阶段限一次,你可以展示自己的一张手牌,然后展示一名其他角色的至多三张手牌。其展示的牌中:每有一张花色相同,你摸一张牌;点数相同,你对其造成1点伤害;均不同,你弃置一张手牌。", zhongjian: "忠鉴", zhongjian_bg: "鉴", - zhongjian3: "忠鉴", - zhongjian3_bg: "鉴", zhongjian_info: "出牌阶段限一次,你可以展示一张手牌,然后展示一名其他角色的X张手牌(X为其体力值)。若以此法展示的牌与你展示的牌:有颜色相同的,你选择:①摸一张牌。②弃置一名其他角色的一张牌;有点数相同的,本回合此技能改为“出牌阶段限两次”;均不同,你的手牌上限-1。", caishi: "才识", caishix: "才识/忠鉴", From 248109b3824d3ae6bd43ab4a43e26aaa46c0e52d Mon Sep 17 00:00:00 2001 From: xizifu <2238983941@qq.com> Date: Wed, 18 Jun 2025 19:46:57 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=B9=90=E8=AF=B8=E8=91=9B=E6=9E=9C?= =?UTF-8?q?=E3=80=90=E4=B9=98=E7=83=9F=E3=80=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/huicui/skill.js | 7 ++----- character/huicui/translate.js | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/character/huicui/skill.js b/character/huicui/skill.js index f10299120d..953ba41dae 100644 --- a/character/huicui/skill.js +++ b/character/huicui/skill.js @@ -605,7 +605,7 @@ const skills = { }, dcyizheng: { audio: 2, - trigger: { player: ["phaseBegin"] },//, "phaseEnd" + trigger: { player: ["phaseBegin"] }, //, "phaseEnd" filter(event, player) { return ( player.countCards("h") && @@ -753,7 +753,7 @@ const skills = { await player.recover(num); //await player.draw(num); await player.removeSkills("dcyizheng"); - if (player.hasSkill("dcboxuan")) { + if (player.hasSkill("dcboxuan", null, null, false)) { player.storage.dcboxuan = true; } game.log(player, `修改了〖博玄〗`); @@ -1963,9 +1963,6 @@ const skills = { audio: 2, trigger: { player: "useCardToPlayered" }, filter(event, player) { - if (!player.isPhaseUsing()) { - return false; - } if (event.card.name != "sha" && get.type(event.card) != "trick") { return false; } diff --git a/character/huicui/translate.js b/character/huicui/translate.js index c62554d724..a99a545f62 100644 --- a/character/huicui/translate.js +++ b/character/huicui/translate.js @@ -547,7 +547,7 @@ const translates = { dcxidi_tag: "笛", dcxidi_info: "锁定技。①游戏开始时,你将手牌标记为“笛”。②你的“笛”牌不计入手牌上限。③准备阶段或结束阶段,你观看牌堆顶X张牌,然后将这些牌以任意顺序置于牌堆顶和牌堆底(X为你手牌中的“笛”数且至少为1)。", dcchengyan: "乘烟", - dcchengyan_info: "当你于出牌阶段使用【杀】或普通锦囊牌指定其他角色为目标后,你可以摸一张牌并展示之,若展示牌为【杀】或可指定目标的普通锦囊牌,你将使用牌对其的结算方式改为展示牌牌名的结算方式;否则,你摸一张牌并标记为“笛”。", + dcchengyan_info: "当你使用【杀】或普通锦囊牌指定其他角色为目标后,你可以摸一张牌并展示之,若展示牌为【杀】或可指定目标的普通锦囊牌,你将使用牌对其的结算方式改为展示牌牌名的结算方式;否则,你摸一张牌并标记为“笛”。", dc_sp_zhurong: "新杀SP祝融", dc_sp_zhurong_prefix: "新杀SP", dcremanhou: "蛮后", @@ -606,7 +606,7 @@ const translates = { dcyizheng: "议政", dcyizheng_info: "你的回合开始时,你可与至多体力上限名其他角色各展示一张手牌,若展示的牌类型均相同,你可将这些牌交给一名角色,否则,你弃置这些牌。", dcguilin: "归林", - dcguilin_info: "限定技,出牌阶段或你进入濒死状态时,你可以回满体力,然后失去〖议政〗并修改〖博玄〗。", + dcguilin_info: "限定技,出牌阶段或你进入濒死状态时,你可以回复所有体力,然后失去〖议政〗并修改〖博玄〗。", dc_xiangchong: "新杀向宠", dc_xiangchong_prefix: "新杀", dcguying: "固营", From 09e85f072c56a1bd8d191a250f69ef20b4631794 Mon Sep 17 00:00:00 2001 From: xizifu <2238983941@qq.com> Date: Fri, 20 Jun 2025 14:23:01 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E7=9A=84changeSeat=E5=92=8CseatRelated=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8D=E5=90=B4=E8=B4=A8=E3=80=90=E5=9C=86?= =?UTF-8?q?=E8=9E=8D=E3=80=91=E8=81=94=E6=9C=BAplayer=E6=9C=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character/extra/skill.js | 6 ++--- character/mobile/skill.js | 3 +-- character/offline/skill.js | 24 +++++++++++-------- character/shiji/skill.js | 5 ++-- character/sixiang/skill.js | 3 +-- character/xianding/skill.js | 4 ++-- character/yxs.js | 3 +-- mode/boss.js | 2 +- mode/chess.js | 2 +- mode/stone.js | 4 ++-- mode/tafang.js | 2 +- mode/versus.js | 16 ++++--------- node_modules/@types/noname-typings/Skill.d.ts | 8 ++++--- 13 files changed, 37 insertions(+), 45 deletions(-) diff --git a/character/extra/skill.js b/character/extra/skill.js index f4a8cf1312..007be6cd8e 100644 --- a/character/extra/skill.js +++ b/character/extra/skill.js @@ -3409,8 +3409,7 @@ const skills = { filter(event, player) { return (event.name != "phase" || game.phaseNumber == 0) && get.info("tamo").getTargets().length > 1; }, - changeSeat: true, - seatRelated: true, + seatRelated: "changeSeat", derivation: "tamo_faq", async cost(event, trigger, player) { const toSortPlayers = get.info(event.skill).getTargets(); @@ -5019,8 +5018,7 @@ const skills = { juexingji: true, skillAnimation: true, animationColor: "orange", - changeSeat: true, - seatRelated: true, + seatRelated: "changeSeat", content() { "step 0"; player.awakenSkill(event.name); diff --git a/character/mobile/skill.js b/character/mobile/skill.js index 50ced4d097..6536adfa9d 100644 --- a/character/mobile/skill.js +++ b/character/mobile/skill.js @@ -20416,8 +20416,7 @@ const skills = { }, multitarget: true, multiline: true, - changeSeat: true, - seatRelated: true, + seatRelated: "changeSeat", contentBefore() { player.$fullscreenpop("败移", "thunder"); }, diff --git a/character/offline/skill.js b/character/offline/skill.js index ddafd82c6a..e99922c4d1 100644 --- a/character/offline/skill.js +++ b/character/offline/skill.js @@ -414,9 +414,13 @@ const skills = { async content(event, trigger, player) { const list = []; for (let positon of ["c", "d", "ej"]) { - const card = get.cardPile(card => { - return get.tag(card, "damage") && positon.includes(get.position(card, true)); - }, "field", "random"); + const card = get.cardPile( + card => { + return get.tag(card, "damage") && positon.includes(get.position(card, true)); + }, + "field", + "random" + ); if (card) { if (positon == "ej") { const owner = get.owner(card); @@ -429,9 +433,11 @@ const skills = { list.push(card); } } - const cards = Array.from(ui.ordering.childNodes).slice(0).filter(card => { - return card && get.tag(card, "damage") && get.position(card, true) == "o"; - }); + const cards = Array.from(ui.ordering.childNodes) + .slice(0) + .filter(card => { + return card && get.tag(card, "damage") && get.position(card, true) == "o"; + }); if (cards.length) { list.push(cards.randomGet()); } @@ -629,8 +635,7 @@ const skills = { const { result } = await next; if (result?.suit == "spade") { await target.damage(2, "thunder"); - } - else if (target.countCards("h")){ + } else if (target.countCards("h")) { await player.gainPlayerCard(target, "h", true); } }, @@ -7925,8 +7930,7 @@ const skills = { hm_qianjun: { limited: true, enable: "phaseUse", - seatRelated: true, - changeSeat: true, + seatRelated: "changeSeat", skillAnimation: true, animationColor: "orange", derivation: "olluanji", diff --git a/character/shiji/skill.js b/character/shiji/skill.js index b30ea0eaad..d465888c72 100644 --- a/character/shiji/skill.js +++ b/character/shiji/skill.js @@ -1080,8 +1080,7 @@ const skills = { audio: 2, enable: "phaseUse", usable: 1, - changeSeat: true, - seatRelated: true, + seatRelated: "changeSeat", limited: true, skillAnimation: true, animationColor: "orange", @@ -5676,7 +5675,7 @@ const skills = { group: "boming_draw", subSkill: { draw: { - audio: 'boming', + audio: "boming", trigger: { player: "phaseJieshuBegin" }, forced: true, locked: false, diff --git a/character/sixiang/skill.js b/character/sixiang/skill.js index 86748d74fa..6840e3b535 100644 --- a/character/sixiang/skill.js +++ b/character/sixiang/skill.js @@ -3800,8 +3800,7 @@ const skills = { skillAnimation: true, limited: true, animationColor: "fire", - changeSeat: true, - seatRelated: true, + seatRelated: "changeSeat", async content(event, trigger, player) { const target = event.targets[0]; player.awakenSkill(event.name); diff --git a/character/xianding/skill.js b/character/xianding/skill.js index f9228a2ba2..158df88539 100644 --- a/character/xianding/skill.js +++ b/character/xianding/skill.js @@ -744,7 +744,7 @@ const skills = { { name: button.link[2] }, ui.selected.buttons.map(i => i.link) ); - return player.hasUseTarget(cardx, true, true) && ui.selected.buttons.length; + return get.player().hasUseTarget(cardx, true, true) && ui.selected.buttons.length; }) .set("complexButton", true) .set("ai", button => { @@ -755,7 +755,7 @@ const skills = { return 0; } const cardx = get.autoViewAs({ name: button.link[2] }); - return player.getUseValue(cardx, true, true); + return get.player().getUseValue(cardx, true, true); }) .forResult(); event.result = { diff --git a/character/yxs.js b/character/yxs.js index 659abcb729..acadf108b9 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -2724,8 +2724,7 @@ game.import("character", function () { qiandu: { enable: "phaseUse", usable: 1, - changeSeat: true, - seatRelated: true, + seatRelated: "changeSeat", filterTarget(card, player, target) { return player != target && player.next != target; }, diff --git a/mode/boss.js b/mode/boss.js index 5485bd64fc..366fb210fe 100644 --- a/mode/boss.js +++ b/mode/boss.js @@ -31,7 +31,7 @@ export default () => { lib.character[i] = lib.characterPack.mode_boss[i]; } for (var i in lib.skill) { - if (lib.skill[i].seatRelated) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; diff --git a/mode/chess.js b/mode/chess.js index d2d881a1c9..7a0e150404 100644 --- a/mode/chess.js +++ b/mode/chess.js @@ -27,7 +27,7 @@ export default () => { } "step 1"; for (var i in lib.skill) { - if (lib.skill[i].seatRelated) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; diff --git a/mode/stone.js b/mode/stone.js index ef6cdb3246..6bc413fa0e 100644 --- a/mode/stone.js +++ b/mode/stone.js @@ -2928,8 +2928,8 @@ export default () => { } lib.skill._recasting.usable = 3; - for (i in lib.skill) { - if (lib.skill[i].seatRelated) { + for (var i in lib.skill) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; diff --git a/mode/tafang.js b/mode/tafang.js index 2cbad11996..01c2dabc2b 100644 --- a/mode/tafang.js +++ b/mode/tafang.js @@ -45,7 +45,7 @@ export default () => { ui.placeChess = result.ui.placeChess; ui.click.moveContainer = result.ui.click.moveContainer; for (var i in lib.skill) { - if (lib.skill[i].seatRelated) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; diff --git a/mode/versus.js b/mode/versus.js index 862dd70053..60135c870f 100644 --- a/mode/versus.js +++ b/mode/versus.js @@ -312,14 +312,6 @@ export default () => { } } - for (var i in lib.skill) { - if (lib.skill[i].changeSeat) { - lib.skill[i] = {}; - if (lib.translate[i + "_info"]) { - lib.translate[i + "_info"] = "固定位置时不可用"; - } - } - } var side = Math.random() < 0.5; var num = Math.floor(Math.random() * 8); @@ -767,7 +759,7 @@ export default () => { lib.characterIntro.boss_fuweizilong = lib.characterIntro.zhaoyun; "step 1"; for (var i in lib.skill) { - if (lib.skill[i].seatRelated) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; @@ -1578,7 +1570,7 @@ export default () => { "step 0"; ui.arena.classList.add("choose-character"); for (var i in lib.skill) { - if (lib.skill[i].seatRelated) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; @@ -2133,7 +2125,7 @@ export default () => { game.enemy = []; for (var i in lib.skill) { - if (lib.skill[i].seatRelated) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; @@ -2578,7 +2570,7 @@ export default () => { } } else { for (var i in lib.skill) { - if (lib.skill[i].seatRelated) { + if (lib.skill[i].seatRelated === true) { lib.skill[i] = {}; if (lib.translate[i + "_info"]) { lib.translate[i + "_info"] = "此模式下不可用"; diff --git a/node_modules/@types/noname-typings/Skill.d.ts b/node_modules/@types/noname-typings/Skill.d.ts index 9632135051..ac5d745694 100644 --- a/node_modules/@types/noname-typings/Skill.d.ts +++ b/node_modules/@types/noname-typings/Skill.d.ts @@ -811,13 +811,13 @@ declare interface Skill { groupSkill?: string; /** - * 是否与座位号相关: + * 是否与座位号/交换座次相关(若为字符串'changeSeat'则表示与交换座次相关): * * 必须要用到座位号的技能都应有此标签 * - * 挑战、战棋、塔防、炉石以及对决模式中部分场景都没有座位号信息,这些场景将屏蔽拥有此标签的技能以避免潜在的问题 + * 挑战、战棋、塔防、炉石以及对决模式中部分场景由于可能有自己的phaseLoop来确定玩家执行回合的顺序导致出现使用player.getSeatNum获取座位号信息默认为0的情况 */ - seatRelated?: boolean; + seatRelated?: string | boolean; /** * 是否与【杀】相关: @@ -837,6 +837,8 @@ declare interface Skill { * 必须要交换/变更座次的技能都应有此标签 * * 对决模式中固定位置的场景将屏蔽拥有此标签的技能以避免潜在的问题 + * + * @deprecated 新的相关判断请改为使用seatRelated:'changeSeat' */ changeSeat?: boolean;