diff --git a/card/kaiheiji.js b/card/kaiheiji.js index 0734a4fd61..ffd73f8321 100644 --- a/card/kaiheiji.js +++ b/card/kaiheiji.js @@ -4,40 +4,466 @@ game.import("card", function () { name: "kaiheiji", connect: true, card: { - //新杀的劝酒 - khquanjiux: { + //烈火 + liehuo: { audio: true, fullskin: true, type: "trick", enable: true, selectTarget: -1, - filterTarget: true, + filterTarget: lib.filter.notMe, reverseOrder: true, multitarget: true, multiline: true, + async content(event, trigger, player) { + let { targets } = event; + targets.add(player); + targets = targets.filter(target => target.countCards("h")).sortBySeat(); + const chooseEvent = player + .chooseCardOL(targets, "烈火:请选择一张手牌", true) + .set("ai", function (card) { + return Math.random(); + }) + .set("source", player); + chooseEvent.aiCard = function (target) { + const hs = target.getCards("h"); + return { bool: true, cards: [hs.randomGet()] }; + }; + chooseEvent._args.remove("glow_result"); + const result = await chooseEvent.forResult(); + if (!targets.includes(player)) { + return; + } + let card = result[targets.indexOf(player)]?.cards[0], + damage = []; + if (!card) { + return; + } + for (let i = 0; i < targets.length; i++) { + if (targets[i] != player) { + if (get.color(result[i].cards[0], targets[i]) == get.color(card, player)) { + damage.push(targets[i]); + } + } + } + if (damage.length) { + await player.modedDiscard(card); + player.line(damage, "fire"); + for (const target of damage.sortBySeat()) { + await target.damage("fire"); + } + } + }, + ai: { + wuxie() { + return Math.random() > 0.75; + }, + order: 7, + useful: 6, + value: 6.5, + result: { + target: -1, + }, + tag: { + damage: 0.5, + multitarget: 1, + multineg: 1, + }, + }, + }, + //神兵 + shenbing: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + selectTarget: -1, + filterTarget: true, + reverseOrder: true, + async contentBefore(event, trigger, player) { + const evt = event.getParent(); + if (!evt.shenbing) { + const result = await player + .chooseControl("弃置牌", "使用牌") + .set("prompt", `神兵:令目标弃置装备区所有牌或依次使用牌堆不用副类型的装备牌各一张。`) + .set("ai", () => (Math.random() > 0.5 ? "弃置牌" : "使用牌")) + .forResult(); + if (result?.control) { + evt.shenbing = result.control == "弃置牌" ? "discard" : "useCard"; + } + } + }, + async content(event, trigger, player) { + const evt = event.getParent(), + { target } = event; + if (evt.shenbing == "discard") { + const cards = target.getCards("e"); + if (cards.length) { + await target.modedDiscard(cards); + } + } + if (evt.shenbing == "useCard") { + for (let i = 1; i < 6; i++) { + if (!target.hasEnabledSlot(i)) { + return; + } + const card = get.cardPile2(function (card) { + return get.subtype(card) == "equip" + i && target.canUse(card, target); + }); + if (card) { + await target.chooseUseTarget(card, true, "nothrow", "nopopup"); + } + } + } + }, + ai: { + wuxie() { + return 0; + }, + order: 7, + useful: 6.5, + value: 7, + result: { + player: 1, + }, + tag: { + multitarget: 1, + }, + }, + }, + //金铙 + jinnao: { + global: ["jinnao_skill"], + enable: true, + fullskin: true, + type: "trick", + toself: true, + filterTarget(card, player, target) { + if (get.mode() == "versus" && _status.mode == "two") { + return player.isFriendOf(target) && player != target; + } + return player != target; + }, + /*changeTarget(player, targets) { + targets.push(player); + },*/ + modTarget(card, player, target) { + return player != target; + }, + async content(event, trigger, player) { + player.addMark("jinnao_skill"); + event.target.addMark("jinnao_skill"); + }, + ai: { + wuxie() { + return Math.random() > 0.5; + }, + order: 5, + useful: 7, + value: 7.2, + result: { + target: 1, + }, + }, + }, + //鹰狼 + yinglang: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + selectTarget: -1, + filterTarget: true, + reverseOrder: true, + async content(event, trigger, player) { + event.target.addTempSkill("yinglang_skill", "roundEnd"); + }, + ai: { + wuxie() { + return 0; + }, + order: 9, + useful: 8.5, + value: 8.5, + result: { + target: 1, + }, + }, + }, + //有福同享 + youfu: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + filterTarget(card, player, target) { + if (get.mode() == "versus" && _status.mode == "two") { + return player.isFriendOf(target) && player != target; + } + return player != target; + }, + modTarget(card, player, target) { + return player != target; + }, + async content(event, trigger, player) { + player.addTempSkill("youfu_skill", ["phaseBefore", "phaseChange", "phaseAfter"]); + player.markAuto("youfu_skill", event.target); + }, + ai: { + wuxie() { + return Math.random() > 0.5; + }, + order: 8, + useful: 6.5, + value: 7, + result: { + target: 1, + }, + }, + }, + //富贵 + fugui: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + filterTarget(card, player, target) { + if (get.mode() == "versus" && _status.mode == "two") { + return player.isFriendOf(target) && player != target; + } + return player != target; + }, + modTarget(card, player, target) { + return player != target; + }, + async content(event, trigger, player) { + const { target } = event; + target + .when({ + player: "gainAfter", + global: "loseAsyncAfter", + }) + .assign({ + firstDo: true, + }) + .filter(evt => evt.getg(target)?.length) + .then(() => { + sourcex.draw(trigger.getg(player)?.length); + }) + .vars({ + sourcex: player, + }); + }, + ai: { + wuxie() { + return Math.random() > 0.5; + }, + order: 7, + useful: 6.5, + value: 7, + result: { + player: 1, + }, + }, + }, + //躺赢狗! + tangying: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + filterTarget(card, player, target) { + if (get.mode() == "versus" && _status.mode == "two") { + return player.isFriendOf(target) && player != target; + } + return player != target; + }, + modTarget(card, player, target) { + return player != target; + }, + async content(event, trigger, player) { + const { target } = event; + for (const phase of lib.phaseName) { + const evt = event.getParent(phase); + if (evt?.name === phase && !evt.skipped) { + const name = get.translation(phase); + game.log(player, "结束了" + name); + evt.skipped = true; + } + } + const evt = event.getParent("phase"); + if (!evt.finished) { + game.log(player, "结束了回合"); + evt.finish(); + } + await player.turnOver(); + if (!_status.auto) { + ui.click.auto(); + } + target.when({ player: "phaseBegin" }).step(async (event, trigger, player) => { + const result = await player + .chooseControl("摸牌阶段", "出牌阶段") + .set("prompt", "躺赢:选择要执行的额外阶段") + .set("ai", () => (Math.random() > 0.5 ? "摸牌阶段" : "出牌阶段")) + .forResult(); + if (result?.control) { + const name = result.control == "摸牌阶段" ? "phaseDraw" : "phaseUse"; + trigger.phaseList.splice(trigger.num, 0, `${name}|${event.name}`); + } + }); + }, + ai: { + wuxie() { + return Math.random() > 0.5; + }, + order: 1, + useful: 5.5, + value: 6, + result: { + target: 1, + }, + }, + }, + //大师 + dashi: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + singleCard: true, + filterTarget: lib.filter.notMe, + filterAddedTarget(card, player, target, preTarget) { + return target != preTarget && target != player; + }, + multicheck() { + return game.hasPlayer(target => target.countCards("h")); + }, + complexSelect: true, + complexTarget: true, + async content(event, trigger, player) { + event.target.swapHandcards(event.addedTarget); + }, + ai: { + order: 6, + useful: 8, + value: 8.2, + result: { + target(player, target) { + const list = []; + let targets = ui.selected.targets.slice(); + if (_status.event.preTarget) { + targets.add(_status.event.preTarget); + } + //const num = player.countCards("he"); + const players = game.filterPlayer(); + if (targets.length == 0) { + for (let i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) > 3) { + list.push(players[i]); + } + } + list.sort(function (a, b) { + return a.countCards("h") - b.countCards("h"); + }); + if (target == list[0]) { + return get.attitude(player, target); + } + return -get.attitude(player, target); + } else { + const from = ui.selected.targets[0]; + for (let i = 0; i < players.length; i++) { + if (players[i] != player && get.attitude(player, players[i]) < 1) { + list.push(players[i]); + } + } + list.sort(function (a, b) { + return b.countCards("h") - a.countCards("h"); + }); + if (from.countCards("h") >= list[0].countCards("h")) { + return -get.attitude(player, target); + } + for (let i = 0; i < list.length && from.countCards("h") < list[i].countCards("h"); i++) { + const count = list[i].countCards("h") - from.countCards("h"); + if (count < 2 && from.countCards("h") >= 2) { + return -get.attitude(player, target); + } + if (target == list[i]) { + return get.attitude(player, target); + } + return -get.attitude(player, target); + } + } + }, + }, + tag: { + multitarget: 1, + norepeat: 1, + }, + }, + }, + //武圣归来 + guilai: { + audio: true, + fullskin: true, + type: "trick", + enable: true, + deadTarget: true, + filterTarget(card, player, target) { + if (get.mode() == "versus" && _status.mode == "two") { + return player.isFriendOf(target) && player != target && target.isDead(); + } + return player != target && target.isDead(); + }, + modTarget(card, player, target) { + return player != target && target.isDead(); + }, + async content(event, trigger, player) { + const { target } = event; + await target.revive(); + await target.draw(3); + }, + ai: { + order: 10, + useful: 8.5, + value: 8.5, + result: { + target: 1, + }, + }, + }, + //新杀的劝酒 + khquanjiux: { + global: ["khquanjiux_skill"], + audio: true, + fullskin: true, + type: "trick", + enable: true, + notarget: true, wuxieable: false, async content(event, trigger, player) { - const { targets } = event; + const targets = game.filterPlayer().sortBySeat(); + player.line(targets); for (const target of targets) { - const cards = target.getCards("h").randomGets(get.rand(1, target.countCards("h"))); + const num = get.rand(1, target.countCards("h")); + const cards = target.getCards("h").randomGets(num); if (!cards.length) { continue; } target.addGaintag(cards, "khquanjiux_tag"); cards.forEach(card => { game.broadcastAll(card => { - if (!card.storage?.origin_info) { - card.storage.origin_info = [card.suit, card.number, card.name, card.nature]; + if (!card.storage?.khquanjiux) { + card.storage.khquanjiux = [card.suit, card.number, card.name, card.nature]; } card.init([card.suit, card.number, "jiu"]); //改回原来的牌名 - card.destroyed = (card, position, player, event) => { - if (card.storage?.origin_info) { - card.init(card.storage.origin_info); - delete card.storage.origin_info; + /*card.destroyed = (card, position, player, event) => { + if (card.storage?.khquanjiux) { + card.init(card.storage.khquanjiux); + delete card.storage.khquanjiux; } return false; - }; + };*/ }, card); }); } @@ -52,26 +478,26 @@ game.import("card", function () { continue; } const { result } = await target - .chooseToUse("劝酒:使用一张【酒】否则受到每名其他角色造成的一点伤害", function (card) { + .chooseToRespond("劝酒:打出一张【酒】否则受到每名其他角色造成的一点伤害", function (card) { if (get.name(card) != "jiu") { return false; } return lib.filter.filterCard.apply(this, arguments); }) - .set("ai1", () => 114514) + .set("ai", () => 114514); + /*.set("ai1", () => 114514) .set("ai2", function () { return get.effect_use.apply(this, arguments) - get.event("effect") + 114514; }) - .set("targetRequired", true) .set( "effect", game.filterPlayer(current => current != target).reduce((eff, current) => eff + get.damageEffect(target, current, target), 0) ) - .set("addCount", false); + .set("addCount", false);*/ if (!result?.bool) { const damage = game.filterPlayer(current => current != target).sortBySeat(); if (damage.length) { - while (damage.length) { + while (damage.length && target.isIn()) { const current = damage.shift(); current.line(target, "yellow"); await target.damage(current); @@ -86,7 +512,7 @@ game.import("card", function () { useful: 7.5, value: 7.5, result: { - target: -1, + player: 1, }, tag: { damage: 0.2, @@ -101,34 +527,34 @@ game.import("card", function () { fullskin: true, type: "trick", enable: true, - selectTarget: -1, - filterTarget: lib.filter.notMe, - reverseOrder: true, - multitarget: true, - multiline: true, + notarget: true, wuxieable: false, global: "nisiwohuo_end", async content(event, trigger, player) { - player.$skill(get.translation(event.name), null, get.groupnature(player.group, "raw")); - const { targets } = event; + player.$skill(get.translation(event.name), null, "thunder", null, "shen_jiaxu"); + await game.delayx(); + const targets = game.filterPlayer(target => target != player).sortBySeat(); + player.line(targets); game.broadcastAll(event => { if (!_status.nisiwohuo) { _status.nisiwohuo = []; } _status.nisiwohuo.push(event); }, event); - let count = 0; + let count = 0, + num = 0; const goon = function () { if (!_status.nisiwohuo?.includes(event)) { return false; } return true; }; - while (goon()) { - const target = targets[count]; + while (goon() && count < 100) { + const target = targets[num]; count++; - if (count >= targets.length) { - count = 0; + num++; + if (num >= targets.length) { + num = 0; } if (!target.isAlive()) { continue; @@ -181,7 +607,7 @@ game.import("card", function () { useful: 9.5, value: 10, result: { - target: -1, + player: 1, }, tag: { //damage: 0.5, @@ -323,7 +749,7 @@ game.import("card", function () { type: "trick", filterTarget: lib.filter.notMe, modTarget: true, - content() { + async content(event, trigger, player) { const cards = []; while (cards.length < 2) { const card = get.cardPile(card => get.tag(card, "damage") > 0.5 && !cards.includes(card)); @@ -334,7 +760,7 @@ game.import("card", function () { } } if (cards.length) { - target.gain(cards, "gain2"); + await event.target.gain(cards, "gain2"); } }, //增兵减灶的ai @@ -365,7 +791,7 @@ game.import("card", function () { filterTarget: true, reverseOrder: true, async content(event, trigger, player) { - const target = event.target; + const { target } = event; const result = await target .chooseToUse("劝酒:使用一张【酒】或点数为9的牌,否则失去1点体力", function (card) { if (get.name(card) != "jiu" && get.number(card) != "unsure" && get.number(card) != 9) { @@ -433,7 +859,8 @@ game.import("card", function () { filterTarget(card, player, target) { return player != target && target.isDying(); }, - content() { + async content(event, trigger, player) { + const { target } = event; player.$skill(get.translation("luojing"), null, get.groupnature(player.group, "raw")); const evt = event.getParent("dying"); if (evt.player == target) { @@ -528,7 +955,8 @@ game.import("card", function () { filterTarget(card, player, target) { return player != target && target.isDying(); }, - content() { + async content(event, trigger, player) { + const { target } = event; player.addSkill("shengsi_debuff"); player.markAuto("shengsi_debuff", target); target.recover(2); @@ -607,10 +1035,8 @@ game.import("card", function () { return !target.isLinked(); }, reverseOrder: true, - content() { - if (!target.isLinked()) { - target.link(true); - } + async content(event, trigger, player) { + await event.target.link(true); }, //照搬铁索的ai ai: { @@ -698,11 +1124,122 @@ game.import("card", function () { }, }, skill: { + khquanjiux_skill: { + charlotte: true, + silent: true, + firstDo: true, + trigger: { + player: "loseBegin", + global: ["addToExpansionBegin", "equipBegin", "loseAsyncBegin", "addJudgeBegin", "gainBegin"], + }, + filter(event, player) { + return event.getl(player)?.cards?.some(card => card.storage?.khquanjiux?.length); + }, + async content(event, trigger, player) { + const cards = trigger.getl(player)?.cards?.filter(card => card.storage?.khquanjiux?.length); + game.broadcastAll(cards => { + cards.forEach(card => { + if (card.storage?.khquanjiux?.length) { + card.init(card.storage.khquanjiux); + delete card.storage.khquanjiux; + } + }); + }, cards); + }, + }, + jinnao_skill: { + charlotte: true, + silent: true, + firstDo: true, + trigger: { player: "damageBegin3" }, + filter(event, player) { + return player.hasMark("jinnao_skill"); + }, + async content(event, trigger, player) { + player.removeMark(event.name, 1); + trigger.cancel(); + }, + intro: { + name: "金铙(金)", + name2: "金", + content: "mark", + markcount: "mark", + }, + }, + yinglang_skill: { + charlotte: true, + silent: true, + firstDo: true, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + return event.target.countGainableCards(player, "he") && event.target != player; + }, + async content(event, trigger, player) { + await player.gainPlayerCard(trigger.target, "he", true); + }, + }, + youfu_skill: { + popup: false, + charlotte: true, + onremove: true, + trigger: { player: "useCard2" }, + filter(event, player) { + if (!["basic", "trick"].includes(get.type(event.card))) { + return false; + } + if (!Array.isArray(event.targets) || !event.targets.includes(player)) { + return false; + } + return game.hasPlayer(target => { + if (!player.getStorage("youfu_skill").includes(target)) { + return false; + } + return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target); + }); + }, + async cost(event, trigger, player) { + const targets = game.filterPlayer(target => { + if (!player.getStorage("youfu_skill").includes(target)) { + return false; + } + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); + }); + if (targets.length == 1) { + const target = targets[0]; + const bool = await player.chooseBool(get.prompt(event.skill, target), "令" + get.translation(target) + "也成为" + get.translation(trigger.card) + "的目标").forResult("bool"); + 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("youfu_skill").includes(target)) { + return false; + } + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); + }) + .set("ai", target => { + const player = get.player(), + trigger = get.event().getTrigger(); + return get.effect(target, trigger.card, player, player); + }) + .forResult(); + } + }, + async content(event, trigger, player) { + player.line(event.targets); + trigger.targets.addArray(event.targets); + game.log(event.targets, "成为了", trigger.card, "的额外目标"); + }, + mark: true, + intro: { + content: "对自己使用基本牌和普通锦囊牌时,可以额外指定 $ 为目标", + }, + }, nisiwohuo_end: { trigger: { global: "die" }, firstDo: true, silent: true, - content() { + async content(event, trigger, player) { game.broadcastAll(() => { if (_status.nisiwohuo?.length) { delete _status.nisiwohuo; @@ -726,7 +1263,7 @@ game.import("card", function () { } return player.hasUsableCard("luojing"); }, - content() { + async content(event, trigger, player) { player .chooseToUse( get.prompt("luojing", trigger.player).replace(/发动/, "使用"), @@ -763,7 +1300,7 @@ game.import("card", function () { } return player.hasUsableCard("shengsi"); }, - content() { + async content(event, trigger, player) { player .chooseToUse( get.prompt("shengsi", trigger.player).replace(/发动/, "使用"), @@ -798,7 +1335,7 @@ game.import("card", function () { filter(event, player) { return player.getStorage("shengsi_debuff").includes(event.player); }, - content() { + async content(event, trigger, player) { player.$skill(get.translation("shengsi"), null, get.groupnature(player.group, "raw")); player.unmarkAuto(event.name, trigger.player); player.die(); @@ -811,19 +1348,64 @@ game.import("card", function () { filter(event, player) { return event.card.name == "leigong"; }, - content() { + async content(event, trigger, player) { const num = game.countPlayer2(target => target.hasHistory("damage", evt => evt.getParent(2) == trigger && evt.notLink())); if (num > 0) { - player.draw(num); + await player.draw(num); } }, }, }, translate: { + liehuo: "烈火", + liehuo_bg: "烈", + liehuo_info: "出牌阶段,对所有其他角色使用,令你和目标暗中选择一张手牌,若有角色与你选择的牌颜色相同,你弃置你选择的牌对这些角色各造成一点火焰伤害。", + shenbing: "神兵", + shenbing_bg: "兵", + shenbing_info: "出牌阶段,对所有角色使用,令目标弃置装备区所有牌或依次使用牌堆不用副类型的装备牌各一张。", + jinnao: "金铙", + jinnao_skill: "金铙", + jinnao_bg: "金", + get jinnao_info() { + const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色"; + return `出牌阶段,对${str}使用,令你和目标获得一个「金」标记。(当目标受到伤害时,其移去一个「金」防止此伤害)`; + }, + yinglang: "鹰狼", + yinglang_skill: "鹰狼", + yinglang_bg: "鹰", + yinglang_info: "出牌阶段,对所有角色使用,令目标本轮使用牌指定其他角色为目标后,获得该目标一张牌。", + youfu: "有福同享", + youfu_skill: "有福同享", + youfu_bg: "福", + get youfu_info() { + const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色"; + return `出牌阶段,对${str}使用,令你此阶段对自己使用基本牌和普通锦囊牌时,可以额外指定其为目标`; + }, + fugui: "富贵", + fugui_bg: "富", + get fugui_info() { + const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色"; + return `出牌阶段,对${str}使用,其下次获得牌后你摸等量张牌。`; + }, + tangying: "躺赢", + tangying_bg: "躺", + get tangying_info() { + const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色"; + return `出牌阶段,你结束当前回合,然后翻面并进入托管状态。令${str}下个回合开始时选择额外执行一个摸牌或出牌阶段。`; + }, + dashi: "大师", + dashi_bg: "师", + dashi_info: "出牌阶段,令两名其他角色交换手牌。", + guilai: "武圣归来", + guilai_bg: "归", + get guilai_info() { + const str = get.mode() == "versus" && _status.mode == "two" ? "一名队友" : "一名其他角色"; + return `出牌阶段,令${str}复活`; + }, khquanjiux: "劝酒", khquanjiux_tag: "劝酒", khquanjiux_bg: "劝", - khquanjiux_info: "出牌阶段,对所有角色使用,所有角色手牌随机变成【酒】,然后依次使用一张【酒】,重复此效果直到有角色不使用,该角色受到每名其他角色造成的一点伤害。此牌不能被【无懈可击】响应。", + khquanjiux_info: "出牌阶段,对所有角色使用,所有角色手牌随机变成【酒】,然后依次打出一张【酒】,重复此效果直到有角色不使用,该角色受到每名其他角色造成的一点伤害。此牌不能被【无懈可击】响应。", nisiwohuo: "你死我活", nisiwohuo_end: "你死我活", nisiwohuo_bg: "死", @@ -861,6 +1443,32 @@ game.import("card", function () { leigong_info: "出牌阶段,对所有角色使用,令目标依次进行一次【闪电】判定,然后每有一名角色因此受到非传导伤害,你摸一张牌。", }, list: [ + [lib.suit.randomGet(), get.rand(1, 13), "liehuo"], + [lib.suit.randomGet(), get.rand(1, 13), "liehuo"], + + [lib.suit.randomGet(), get.rand(1, 13), "shenbing"], + [lib.suit.randomGet(), get.rand(1, 13), "shenbing"], + + [lib.suit.randomGet(), get.rand(1, 13), "jinnao"], + [lib.suit.randomGet(), get.rand(1, 13), "jinnao"], + + [lib.suit.randomGet(), get.rand(1, 13), "yinglang"], + [lib.suit.randomGet(), get.rand(1, 13), "yinglang"], + + [lib.suit.randomGet(), get.rand(1, 13), "youfu"], + [lib.suit.randomGet(), get.rand(1, 13), "youfu"], + + [lib.suit.randomGet(), get.rand(1, 13), "fugui"], + [lib.suit.randomGet(), get.rand(1, 13), "fugui"], + + [lib.suit.randomGet(), get.rand(1, 13), "tangying"], + [lib.suit.randomGet(), get.rand(1, 13), "tangying"], + + [lib.suit.randomGet(), get.rand(1, 13), "guilai"], + + [lib.suit.randomGet(), get.rand(1, 13), "dashi"], + [lib.suit.randomGet(), get.rand(1, 13), "dashi"], + ["spade", 13, "khquanjiux"], ["diamond", 13, "khquanjiux"], ["heart", 13, "khquanjiux"], diff --git a/character/extra/skill.js b/character/extra/skill.js index 08163c33d9..8471972b96 100644 --- a/character/extra/skill.js +++ b/character/extra/skill.js @@ -737,12 +737,14 @@ const skills = { const targets = game.filterPlayer(target => target != player); player.line(targets); if (choices.includes("fengyin")) { + game.log(player, "选择了", "#y准备阶段、结束阶段", "的效果"); for (const target of targets) { target.when({ player: "phaseJieshuBefore" }).then(() => player.addTempSkill("fengyin", ["phaseBefore", "phaseChange", "phaseAfter"])); target.when({ player: "phaseZhunbeiBefore" }).then(() => player.addTempSkill("fengyin", ["phaseBefore", "phaseChange", "phaseAfter"])); } } if (choices.includes("judge")) { + game.log(player, "选择了", "#y判定阶段", "的效果"); for (const target of targets) { target.when({ player: "phaseJudgeBegin" }).step(async (event, trigger, player) => { const result = await player @@ -762,44 +764,54 @@ const skills = { } } if (choices.includes("discard")) { - game.addGlobalSkill("dclishi_discard"); + game.log(player, "选择了", "#y摸牌阶段", "的效果"); for (const target of targets) { - target.when({ player: "phaseDrawBegin" }).then(() => trigger.set("dclishi", player.playerid)); + target.addTempSkill("dclishi_discard", { player: "phaseDrawAfter" }); + //target.when({ player: "phaseDrawBegin" }).then(() => trigger.set("dclishi", player.playerid)); } } if (choices.includes("use")) { + game.log(player, "选择了", "#y出牌阶段", "的效果"); for (const target of targets) { - target.when({ player: "phaseUseBegin" }).then(() => player.addTempSkill("dclishi_limit", ["phaseBefore", "phaseChange", "phaseAfter"])); + target.addTempSkill("dclishi_limit", { player: "phaseUseAfter" }); + //target.when({ player: "phaseUseBegin" }).then(() => player.addTempSkill("dclishi_limit", ["phaseBefore", "phaseChange", "phaseAfter"])); } } if (choices.includes("gain")) { - player.addSkill("dclishi_gain"); + game.log(player, "选择了", "#y弃牌阶段", "的效果"); for (const target of targets) { - target.when({ player: "phaseDiscardBegin" }).then(() => trigger.set("dclishi", player.playerid)); + target.addTempSkill("dclishi_gain", { player: "phaseDiscardAfter" }); + target.markAuto("dclishi_gain", player); + //target.when({ player: "phaseDiscardBegin" }).then(() => trigger.set("dclishi", player.playerid)); } } }, subSkill: { gain: { trigger: { - global: ["loseAsyncAfter", "loseAfter"], + player: ["loseAfter"], + global: ["loseAsyncAfter"], }, charlotte: true, forced: true, popup: false, + onremove: true, filter(event, player) { if (event.type !== "discard") { return false; } const evt = event.getParent("phaseDiscard"); - if (evt?.dclishi !== event.player.playerid) { - return false; - } - const evt2 = event.getl(event.player); - return evt?.name === "phaseDiscard" && evt?.player === event.player && evt2?.cards2?.filterInD("d"); + const evt2 = event.getl(player); + return evt?.name === "phaseDiscard" && evt?.player === player && evt2?.cards2?.filterInD("d"); }, async content(event, trigger, player) { - await player.gain(trigger.getl(trigger.player).cards2.filterInD("d"), "gain2"); + const gainer = player + .getStorage(event.name) + .sortBySeat() + .find(target => target.isIn()); + if (gainer) { + await gainer.gain(trigger.getl(player).cards2.filterInD("d"), "gain2"); + } }, }, limit: { @@ -807,6 +819,7 @@ const skills = { onremove: true, trigger: { player: "useCard1" }, silent: true, + firstDo: true, filter(event, player) { return player.isPhaseUsing(); }, @@ -833,15 +846,15 @@ const skills = { forced: true, popup: false, trigger: { - global: ["gainAfter", "loseAsyncAfter"], + player: ["gainAfter"], }, filter(event, player) { const evt = event.getParent("phaseDraw"); - const cards = event?.getg?.(player); - return event.getParent()?.name == "draw" && evt?.name === "phaseDraw" && evt?.dclishi === player.playerid && cards.map(card => get.color(card)).unique().length == 1; + const cards = event.getg?.(player); + return event.getParent()?.name == "draw" && evt?.name === "phaseDraw" && evt?.player === player && cards.map(card => get.color(card)).unique().length == 1; }, async content(event, trigger, player) { - let cards = trigger.getg(player); + const cards = trigger.getg(player); await player.modedDiscard(cards); }, }, @@ -10565,11 +10578,7 @@ const skills = { audio: 2, async cost(event, trigger, player) { const { - result: { - bool, - targets, - links: cost_data, - } + result: { bool, targets, links: cost_data }, } = await player .chooseButtonTarget({ createDialog: [get.prompt2(event.skill), player.getExpansions("qixing")], @@ -10625,12 +10634,12 @@ const skills = { return -1; }, }) - .set("allUse", player.getExpansions("qixing").length >= game.countPlayer(current => get.attitude(player, current) > 4) * 2) + .set("allUse", player.getExpansions("qixing").length >= game.countPlayer(current => get.attitude(player, current) > 4) * 2); event.result = { bool: bool, targets: targets?.sortBySeat(), cost_data: cost_data, - } + }; }, async content(event, trigger, player) { const { targets, cost_data: cards } = event; @@ -10693,33 +10702,30 @@ const skills = { }, async cost(event, trigger, player) { const { - result: { - bool, - targets, - links: cost_data, - } - } = await player - .chooseButtonTarget({ - createDialog: [get.prompt2(event.skill), player.getExpansions("qixing")], - selectButton: 1, - filterTarget: true, - ai1(button) { - if (game.hasPlayer(target => { + result: { bool, targets, links: cost_data }, + } = await player.chooseButtonTarget({ + createDialog: [get.prompt2(event.skill), player.getExpansions("qixing")], + selectButton: 1, + filterTarget: true, + ai1(button) { + if ( + game.hasPlayer(target => { return get.attitude(get.player(), target) < 0; - })) { - return 1; - } - return 0; - }, - ai2(target) { - return -get.attitude(get.player(), target); - }, - }); + }) + ) { + return 1; + } + return 0; + }, + ai2(target) { + return -get.attitude(get.player(), target); + }, + }); event.result = { bool: bool, targets: targets?.sortBySeat(), cost_data: cost_data, - } + }; }, async content(event, trigger, player) { const { targets, cost_data: cards } = event; diff --git a/character/mobile/skill.js b/character/mobile/skill.js index 72e0be7e6d..82a627cd8f 100644 --- a/character/mobile/skill.js +++ b/character/mobile/skill.js @@ -38,8 +38,7 @@ const skills = { if (num > 0) { if (!player.isDamaged()) { await player.draw(num); - } - else { + } else { await player.recover(num); } await player.draw(num); @@ -72,16 +71,19 @@ const skills = { }, async cost(event, trigger, player) { const result = await player - .chooseButton([ - get.prompt(event.skill), + .chooseButton( [ + get.prompt(event.skill), [ - ["losehp", "失去任意点体力,令你此阶段使用的前等量张牌不计入次数限制"], - ["discard", "弃置任意张手牌,令你此阶段使用的前等量张牌无距离限制且不可被响应"], + [ + ["losehp", "失去任意点体力,令你此阶段使用的前等量张牌不计入次数限制"], + ["discard", "弃置任意张手牌,令你此阶段使用的前等量张牌无距离限制且不可被响应"], + ], + "textbutton", ], - "textbutton", - ] - ], [1, 2]) + ], + [1, 2] + ) .set("filterButton", button => { const player = get.player(); if (button.link == "discard") { @@ -91,7 +93,7 @@ const skills = { }) .set("ai", button => { const player = get.player(), - num = Math.floor(player.countCards("h")/2); + num = Math.floor(player.countCards("h") / 2); if (button.link == "discard") { return num; } @@ -108,22 +110,25 @@ const skills = { if (select == "nouse") { await player.gainMaxHp(); await player.recover(); - } - else { + } else { if (select.includes("losehp")) { const { result } = await player - .chooseNumbers(get.translation(event.name), [ - { - prompt: "失去任意点体力值,令你此阶段使用的前等量张牌不计入次数限制", - min: 1, - max: player.getHp(), - } - ], true) + .chooseNumbers( + get.translation(event.name), + [ + { + prompt: "失去任意点体力值,令你此阶段使用的前等量张牌不计入次数限制", + min: 1, + max: player.getHp(), + }, + ], + true + ) .set("processAI", () => { - const player = get.player(); - let num = Math.floor(player.countCards("h")/2); - return [num]; - }); + const player = get.player(); + let num = Math.floor(player.countCards("h") / 2); + return [num]; + }); const number = result.numbers[0]; await player.loseHp(number); player.addTempSkill("potzhuangshi_limit", "phaseChange"); @@ -136,7 +141,7 @@ const skills = { .set("prompt2", "弃置任意张手牌,令你此阶段使用的前等量张牌无距离限制且不可被响应") .set("ai", card => { const player = get.player(); - let num = Math.floor(player.countCards("h")/2); + let num = Math.floor(player.countCards("h") / 2); if (ui.selected.cards.length < num) { return 7 - get.value(card); } @@ -171,8 +176,7 @@ const skills = { const num = player.countMark("potzhuangshi_limit"); if (num > 0) { player.addTip("potzhuangshi_limit", `不计次数 ${num}`); - } - else { + } else { player.removeTip("potzhuangshi_limit"); } }, @@ -198,8 +202,7 @@ const skills = { const num = player.countMark("potzhuangshi_directHit"); if (num > 0) { player.addTip("potzhuangshi_directHit", `不可响应 ${num}`); - } - else { + } else { player.removeTip("potzhuangshi_directHit"); } }, @@ -250,8 +253,9 @@ const skills = { .filter(evt => evt == trigger.getParent(2)) .step(async (event, trigger, player) => { if (target.isIn() && target.countCards("he")) { - const { result: { cards }} = await player - .discardPlayerCard(target, "he", true); + const { + result: { cards }, + } = await player.discardPlayerCard(target, "he", true); if (bool1) { await player.gain(cards.filterInD("od"), "gain2"); } @@ -280,19 +284,14 @@ const skills = { choiceList.push("背水:弃置一张牌并令你本阶段使用【杀】的次数+1"); } if (player.isDamaged()) { - list.unshift("recover_hp") - } - else { + list.unshift("recover_hp"); + } else { choiceList[0] = `${choiceList[0]}`; } if (list.length == 1) { - event.result = await player - .chooseBool(get.prompt(event.skill), "摸一张牌") - .set("frequentSkill", event.skill) - .forResult(); + event.result = await player.chooseBool(get.prompt(event.skill), "摸一张牌").set("frequentSkill", event.skill).forResult(); event.result.cost_data = "draw_card"; - } - else { + } else { list.push("cancel2"); if ( player.isDamaged() && @@ -303,8 +302,7 @@ const skills = { ) { if (player.countCards("he") > 1 && list.includes("背水!")) { choice = "背水!"; - } - else { + } else { choice = "recover_hp"; } } else { @@ -529,11 +527,13 @@ const skills = { if (!target.countCards("h")) { return; } - const result = target.countCards("h") > 2 ? await target - .chooseCard("劲镞:展示两张手牌", 2, "h", true).forResult() : { - bool: true, - cards: target.getCards("h"), - }; + const result = + target.countCards("h") > 2 + ? await target.chooseCard("劲镞:展示两张手牌", 2, "h", true).forResult() + : { + bool: true, + cards: target.getCards("h"), + }; if (!result.bool) { return; } @@ -2324,7 +2324,7 @@ const skills = { filterTarget: true, async content(event, trigger, player) { const target = event.targets[0]; - const num = target.maxHp - target.countCards("h"); + const num = Math.min(5, target.maxHp) - target.countCards("h"); const isMax = target.isMaxHandcard(); if (num > 0) { await target.drawTo(target.maxHp); @@ -13804,7 +13804,7 @@ const skills = { async cost(event, trigger, player) { event.result = await player.chooseTarget("安国:令一名其他角色获得“安国”标记", lib.filter.notMe, true).forResult(); }, - content() { + async content(event, trigger, player) { const target = event.targets[0]; target.addMark("sbanguo_mark", 1, false); target.addAdditionalSkill("sbanguo_" + player.playerid, "sbanguo_mark"); @@ -13828,16 +13828,14 @@ const skills = { }, move: { audio: ["sbanguo1.mp3", "sbanguo2.mp3"], - direct: true, trigger: { player: "phaseUseBegin" }, filter(event, player) { return game.hasPlayer(current => current.hasSkill("sbanguo_mark")) && game.hasPlayer(current => !current.hasMark("sbanguo_marked") && current != player); }, - content() { - "step 0"; - var targets = game.filterPlayer(current => current.hasSkill("sbanguo_mark")); - var prompt2 = targets.length == 1 ? "将" + get.translation(targets[0]) + "的“安国”交给一名未获得过“安国”的其他角色" : "选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色"; - player + async cost(event, trigger, player) { + const targets = game.filterPlayer(current => current.hasSkill("sbanguo_mark")); + const prompt2 = targets.length == 1 ? "将" + get.translation(targets[0]) + "的“安国”交给一名未获得过“安国”的其他角色" : "选择一名有“安国”的角色,将该标记交给一名未获得过“安国”的其他角色"; + event.result = await player .chooseTarget(get.prompt("sbanguo"), prompt2, targets.length == 1 ? 1 : 2, (card, player, target) => { if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) { return target.hasSkill("sbanguo_mark"); @@ -13851,30 +13849,31 @@ const skills = { } return get.attitude(player, _status.event.targets[0]) < get.attitude(player, target); }) - .set("targets", targets); - "step 1"; - if (result.bool) { - var targets = result.targets; - if (targets.length == 1) { - var target1 = game.filterPlayer(current => current.hasSkill("sbanguo_mark"))[0]; - var target2 = targets[0]; - } else { - var target1 = targets[0]; - var target2 = targets[1]; - } - player.logSkill("sbanguo_move", target2, false); - player.line2([target1, target2], "green"); - var map = target1.additionalSkills; - for (var key in map) { - if (key.indexOf("sbanguo_") != 0) { - continue; - } - var id = parseInt(key.slice(8)); - target1.removeAdditionalSkill("sbanguo_" + id); - target2.addMark("sbanguo_mark", 1, false); - target2.addAdditionalSkill("sbanguo_" + id, "sbanguo_mark"); - target2.addMark("sbanguo_marked", 1, false); + .set("targets", targets) + .set("line", false) + .forResult(); + }, + async content(event, trigger, player) { + const { targets } = event; + let target1, target2; + if (targets.length == 1) { + target1 = game.filterPlayer(current => current.hasSkill("sbanguo_mark"))[0]; + target2 = targets[0]; + } else { + target1 = targets[0]; + target2 = targets[1]; + } + player.line2([target1, target2], "green"); + const map = target1.additionalSkills; + for (const key in map) { + if (key.indexOf("sbanguo_") != 0) { + continue; } + const id = parseInt(key.slice(8)); + target1.removeAdditionalSkill("sbanguo_" + id); + target2.addMark("sbanguo_mark", 1, false); + target2.addAdditionalSkill("sbanguo_" + id, "sbanguo_mark"); + target2.addMark("sbanguo_marked", 1, false); } }, }, @@ -13892,7 +13891,7 @@ const skills = { } return event.num >= player.hp; }, - content() { + async content(event, trigger, player) { trigger.cancel(); }, ai: { @@ -13927,42 +13926,39 @@ const skills = { return skills && skills.length; }, logTarget: "player", - content() { - "step 0"; - trigger.player.removeAdditionalSkill("sbanguo_" + player.playerid); - var num = 1 - trigger.player.hp; - if (num > 0) { - trigger.player.recover(num); - } - "step 1"; - var hp = player.hp - 1, + async content(event, trigger, player) { + const target = trigger.player; + target.removeAdditionalSkill("sbanguo_" + player.playerid); + await target.recoverTo(1); + const hp = player.hp - 1, maxhp = player.maxHp - 1; + let result; if (hp > 0 && maxhp > 0) { - player + result = await player .chooseControl() .set("prompt", "安国:请选择一项") - .set("choiceList", ["失去" + hp + "点体力,令" + get.translation(trigger.player) + "获得1点护甲", "减" + maxhp + "点体力上限,令" + get.translation(trigger.player) + "获得1点护甲"]) - .set("ai", () => "选项一"); + .set("choiceList", ["失去" + hp + "点体力,令" + get.translation(target) + "获得1点护甲", "减" + maxhp + "点体力上限,令" + get.translation(target) + "获得1点护甲"]) + .set("ai", () => "选项一") + .forResult(); } else if (hp > 0) { - event._result = { control: "选项一" }; + result = { control: "选项一" }; } else if (maxhp > 0) { - event._result = { control: "选项二" }; + result = { control: "选项二" }; } else { - event.finish(); + return; } - "step 2"; - if (result.control == "选项一") { + if (result?.control == "选项一") { var num = player.hp - 1; if (num > 0) { - player.loseHp(num); + await player.loseHp(num); } - } else { + } else if (result?.control == "选项二") { var num = player.maxHp - 1; if (num > 0) { - player.loseMaxHp(num); + await player.loseMaxHp(num); } } - trigger.player.changeHujia(1, null, true); + await target.changeHujia(1, null, true); }, }, }, @@ -16780,40 +16776,35 @@ const skills = { huantu: { audio: 2, trigger: { global: "phaseDrawBefore" }, - direct: true, + round: 1, filter(event, player) { - return player.countCards("he") > 0 && !player.hasSkill("huantu_round") && player.inRange(event.player); + return player.countCards("he") > 0 && player.inRange(event.player); }, checkx(event, player) { - var target = event.player; + const target = event.player; return get.attitude(player, target) > 0 && (target.hasSkill("pingkou") || target.skipList.includes("phaseUse") || (target.isDamaged() && target.hp <= 2) || target.needsToDiscard()); }, - content() { - "step 0"; - player - .chooseCard(get.prompt("huantu", trigger.player), "交给其一张牌并令其暂时跳过摸牌阶段", "he") + async cost(event, trigger, player) { + event.result = await player + .chooseCard(get.prompt(event.skill, trigger.player), "交给其一张牌并令其暂时跳过摸牌阶段", "he") .set("ai", function (card) { if (!_status.event.checkx) { return 0; } return 1 + Math.random(); }) - .set("checkx", lib.skill.huantu.checkx(trigger, player)); - "step 1"; - if (result.bool) { - player.addTempSkill("huantu_round", "roundStart"); - player.logSkill("huantu", trigger.player); - player.give(result.cards, trigger.player); - trigger.cancel(); - player.addTempSkill("huantu_effect"); - } + .set("checkx", lib.skill.huantu.checkx(trigger, player)) + .forResult(); + }, + logTarget: "player", + async content(event, trigger, player) { + const target = event.targets[0], + { cards } = event; + await player.give(cards, target); + trigger.cancel(); + player.addTempSkill(event.name + "_effect"); }, subSkill: { - round: { - charlotte: true, - mark: true, - intro: { content: "本轮已发动" }, - }, effect: { audio: "huantu", trigger: { global: "phaseJieshuBegin" }, @@ -16823,36 +16814,22 @@ const skills = { filter(event, player) { return event.player.isIn(); }, - content() { - "step 0"; - var str = get.translation(trigger.player); - player + async content(event, trigger, player) { + const target = trigger.player, + str = get.translation(target); + const result = await player .chooseControl() .set("choiceList", ["令" + str + "回复1点体力并摸两张牌", "摸三张牌,然后交给" + str + "两张手牌"]) - .set("choice", trigger.player.isDamaged() ? 0 : 1); - "step 1"; - if (result.index == 0) { - trigger.player.recover(); - trigger.player.draw(2); - event.finish(); - } else { - event.target = trigger.player; - player.draw(3); - } - "step 2"; - var hs = player.getCards("h"); - if (hs.length && target.isIn() && player.isIn()) { - if (hs.length <= 2) { - event._result = { bool: true, cards: hs }; - } else { - player.chooseCard("h", 2, true, "交给" + get.translation(target) + "两张手牌"); + .set("choice", target.isDamaged() ? 0 : 1) + .forResult(); + if (result?.index == 0) { + await target.recover(); + await target.draw(2); + } else if (result?.index == 1) { + await player.draw(3); + if (player.countCards("h") && target.isIn()) { + await player.chooseToGive(target, 2, true, "h"); } - } else { - event.finish(); - } - "step 3"; - if (result.bool) { - player.give(result.cards, trigger.player); } }, }, @@ -16871,11 +16848,12 @@ const skills = { check(event, player) { return get.attitude(player, event.player) > 0; }, - content() { + async content(event, trigger, player) { + const target = trigger.player; player.awakenSkill(event.name); - trigger.player.draw(3); - trigger.player.addTempSkill("bihuo_effect", "roundStart"); - trigger.player.addMark("bihuo_effect", game.countPlayer(), false); + await target.draw(3); + target.addTempSkill("bihuo_effect", "roundStart"); + target.addMark("bihuo_effect", game.countPlayer(), false); }, subSkill: { effect: { diff --git a/character/mobile/translate.js b/character/mobile/translate.js index 71598607a1..adfc12a6eb 100644 --- a/character/mobile/translate.js +++ b/character/mobile/translate.js @@ -1034,7 +1034,7 @@ const translates = { mbyuanmo_info: "每回合限两次,准备阶段或当你受到伤害后,你可以移动场上的一张牌,然后你可以令因此失去牌的角色摸X张牌(X为其攻击范围内因此减少的角色数且至多为5)", wuke: "吴珂", mbzhuguo: "助国", - mbzhuguo_info: "出牌阶段限一次,你可令一名角色将手牌调整至体力上限。然后:若其没有摸牌,则回复1点体力;若其因此成为手牌数最多的角色,你可以选另一名角色,令其选择是否对你指定的另一名角色使用一张无距离限制的【杀】。", + mbzhuguo_info: "出牌阶段限一次,你可令一名角色将手牌调整至X(X为其体力上限且至多为5)。然后:若其没有摸牌,则回复1点体力;若其因此成为手牌数最多的角色,你可以选另一名角色,令其选择是否对你指定的另一名角色使用一张无距离限制的【杀】。", mbanda: "谙达", mbanda_info: "每回合限一次,当一名角色进入濒死状态时,你可令伤害来源交给其两张颜色不同的牌,否则该角色回复1点体力。", mb_xingdaorong: "手杀邢道荣", diff --git a/character/offline/skill.js b/character/offline/skill.js index 077637a3f5..0654912a9e 100644 --- a/character/offline/skill.js +++ b/character/offline/skill.js @@ -16,30 +16,38 @@ const skills = { }, async cost(event, trigger, player) { const targets = game.filterPlayer(current => current != player); - event.result = targets.length > 1 ? await player - .chooseTarget(get.prompt2(event.skill), (card, player, target) => { - if (target == player) { - return false; - } - if (ui.selected.targets.length) { - const targetx = ui.selected.targets[0]; - return target == targetx.getPrevious() || target == targetx.getNext(); - } - return true; - }, true, 2) - .set("targetprompt", ["执行回合", "交换位置"]) - .set("complexTarget", true) - .set("ai", target => { - const att = get.attitude(get.player(), target); - if (ui.selected.targets.length) { - return -att; - } - return att; - }) - .forResult() : { - bool: true, - targets: targets, - }; + event.result = + targets.length > 1 + ? await player + .chooseTarget( + get.prompt2(event.skill), + (card, player, target) => { + if (target == player) { + return false; + } + if (ui.selected.targets.length) { + const targetx = ui.selected.targets[0]; + return target == targetx.getPrevious() || target == targetx.getNext(); + } + return true; + }, + true, + 2 + ) + .set("targetprompt", ["执行回合", "交换位置"]) + .set("complexTarget", true) + .set("ai", target => { + const att = get.attitude(get.player(), target); + if (ui.selected.targets.length) { + return -att; + } + return att; + }) + .forResult() + : { + bool: true, + targets: targets, + }; }, async content(event, trigger, player) { const targets = event.targets; @@ -49,7 +57,7 @@ const skills = { game.swapSeat(target1, target2); }, player, - targets[1], + targets[1] ); } await game.delay(3); @@ -84,8 +92,7 @@ const skills = { content(storage, player, skill) { if (storage) { return "所有角色的基本牌视为无次数限制的【杀】"; - } - else if (storage === false) { + } else if (storage === false) { return "所有角色与你互相计算距离为1,你视为拥有〖同忾〗"; } return get.skillInfoTranslation(skill, player); @@ -96,8 +103,7 @@ const skills = { player.changeZhuanhuanji(event.name); if (player.getStorage(event.name, false)) { player.removeAdditionalSkill(event.name); - } - else { + } else { player.addAdditionalSkill(event.name, ["petongkai"]); } }, @@ -120,16 +126,22 @@ const skills = { viewas: { mod: { cardname(card, player) { - if (game.hasPlayer(current => { - return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true; - }) && lib.card[card.name]?.type == "basic") { + if ( + game.hasPlayer(current => { + return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true; + }) && + lib.card[card.name]?.type == "basic" + ) { return "sha"; } }, cardUsable(card, player) { - if (!game.hasPlayer(current => { - return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true; - }) || card.name != "sha") { + if ( + !game.hasPlayer(current => { + return current.hasSkill("peyuanjue") && current.getStorage("peyuanjue") === true; + }) || + card.name != "sha" + ) { return; } if (!card.cards || card.cards.length != 1) { @@ -138,7 +150,7 @@ const skills = { if (get.suit(card) == "unsure" || lib.card[card.cards[0].name]?.type == "basic") { return Infinity; } - } + }, }, }, }, @@ -155,12 +167,7 @@ const skills = { async cost(event, trigger, player) { const result = await player .chooseControl(["选项一", "选项二", "选项三", "背水!", "cancel2"]) - .set("choiceList", [ - "选项一:摸一张牌", - "选项二:回复1点体力", - "选项三:使用一张牌", - "背水,减少1点体力上限", - ]) + .set("choiceList", ["选项一:摸一张牌", "选项二:回复1点体力", "选项三:使用一张牌", "背水,减少1点体力上限"]) .set("displayIndex", false) .set("ai", () => { return get.player().hp <= 2 ? "选项二" : "选项一"; @@ -211,10 +218,7 @@ const skills = { if (trigger.target == player) { return; } - const result = await player - .chooseToGive(true, "he", trigger.target) - .set("visibleMove", true) - .forResult(); + const result = await player.chooseToGive(true, "he", trigger.target).set("visibleMove", true).forResult(); if (!result.bool) { return; } @@ -247,7 +251,7 @@ const skills = { game.swapSeat(target1, target2); }, player, - zhu.getPrevious(), + zhu.getPrevious() ); } let newzhu = game.findPlayer(i => i.getSeatNum() == 1); @@ -291,7 +295,7 @@ const skills = { target: "useCardToTarget", }, filter(event, player) { - return player.storage?.yjjiechu && event?.card.name === "sha" + return player.storage?.yjjiechu && event?.card.name === "sha"; }, async cost(event, trigger, player) { let suits = [], @@ -299,19 +303,21 @@ const skills = { game.getAllGlobalHistory("everything", evt => { if (evt.name == "damage" && evt.player == player && evt.card) { suits.add(get.suit(evt.card)); - }; + } }); if (suits.includes(get.suit(trigger.card)) && player.hasSkill("pedaojue")) { bool = true; } let list = lib.linked.slice(0).remove("kami"); - if (list.some(nature => { - if (nature == trigger.card?.nature) { - return false; - } - let card = new lib.element.VCard(trigger.card, trigger.cards, null, nature); - return get.effect(player, card, trigger.player, player) > get.effect(player, trigger.card, trigger.player, player); - })) { + if ( + list.some(nature => { + if (nature == trigger.card?.nature) { + return false; + } + let card = new lib.element.VCard(trigger.card, trigger.cards, null, nature); + return get.effect(player, card, trigger.player, player) > get.effect(player, trigger.card, trigger.player, player); + }) + ) { bool = true; } event.result = await player @@ -335,7 +341,7 @@ const skills = { game.getAllGlobalHistory("everything", evt => { if (evt.name == "damage" && evt.player == player && evt.card) { records.remove(get.suit(evt.card)); - }; + } }); let nature = trigger.card.nature; for (let i of natures) { @@ -348,11 +354,7 @@ const skills = { } } const result = await player - .chooseButton([ - "劫出:改变此牌的花色和属性", - [suits.map(i => ["", "", `lukai_${i}`]), "vcard"], - [natures.map(i => [i, get.translation(i)]), "tdnodes"], - ], 2, true) + .chooseButton(["劫出:改变此牌的花色和属性", [suits.map(i => ["", "", `lukai_${i}`]), "vcard"], [natures.map(i => [i, get.translation(i)]), "tdnodes"]], 2, true) .set("filterButton", button => { if (!ui.selected.buttons.length) { return true; @@ -386,9 +388,13 @@ const skills = { suit = result.links[1][2].slice(6); player.popup(get.translation(suit)); game.log(trigger.card, "被转为了", "#y" + get.translation(suit), "花色"); - game.broadcastAll((card, suit) => { - card.suit = suit; - }, trigger.card, suit); + game.broadcastAll( + (card, suit) => { + card.suit = suit; + }, + trigger.card, + suit + ); player.popup(`${get.translation(naturex)}杀`, naturex); game.log(trigger.card, "被转为了", "#y" + get.translation(naturex), "属性"); game.setNature(trigger.card, naturex); @@ -399,7 +405,7 @@ const skills = { player: "useCardAfter", }, filter(event, player) { - return event.targets.length && event?.card?.storage?.yjjiechu + return event.targets.length && event?.card?.storage?.yjjiechu; }, charlotte: true, silent: true, @@ -417,7 +423,7 @@ const skills = { .set("targetRequired", true) .set("complexSelect", true) .set("filterTarget", function (card, player, target) { - const sourcex = get.event("sourcex") + const sourcex = get.event("sourcex"); if (target !== sourcex && !ui.selected.targets.includes(sourcex)) { return false; } @@ -440,10 +446,10 @@ const skills = { filterCard: () => false, selectCard: -1, viewAsFilter(player) { - return !player.storage?.yjjiechu + return !player.storage?.yjjiechu; }, precontent() { - player.addTempSkill("yjjiechu_effect") + player.addTempSkill("yjjiechu_effect"); player.changeZhuanhuanji("yjjiechu"); }, }, @@ -463,7 +469,7 @@ const skills = { player: "useCardAfter", }, filter(event, player) { - return player.getAllHistory("useCard", (evt) => evt.getParent(3).skill === "yjdaojue_effect").length === 3 + return player.getAllHistory("useCard", evt => evt.getParent(3).skill === "yjdaojue_effect").length === 3; }, skillAnimation: true, animationColor: "metal", @@ -472,10 +478,10 @@ const skills = { async content(event, trigger, player) { player.awakenSkill("yjdaojue"); player.removeTip("yjdaojue"); - player.popup("袁绍") - await player.removeSkills("yjjiechu") - await player.changeGroup("qun") - await player.addSkills(["olsbshenli", "yjzhuni", "olsbshishou"]) + player.popup("袁绍"); + await player.removeSkills("yjjiechu"); + await player.changeGroup("qun"); + await player.addSkills(["olsbshenli", "yjzhuni", "olsbshishou"]); }, }, achieve: { @@ -488,15 +494,20 @@ const skills = { forced: true, locked: false, filter(event, player) { - return player.getAllHistory("gain", (evt) => evt.getParent(2).skill === "yjdaojue_effect").map(c => c.cards.length).reduce((sum, cur) => sum + cur, 0) >= 3; + return ( + player + .getAllHistory("gain", evt => evt.getParent(2).skill === "yjdaojue_effect") + .map(c => c.cards.length) + .reduce((sum, cur) => sum + cur, 0) >= 3 + ); }, async content(event, trigger, player) { player.awakenSkill("yjdaojue"); player.removeTip("yjdaojue"); - player.popup("曹操") - await player.removeSkills("yjjiechu") - await player.changeGroup("wei") - await player.addSkills(["yjzhian", "yjqingzheng", "rehujia"]) + player.popup("曹操"); + await player.removeSkills("yjjiechu"); + await player.changeGroup("wei"); + await player.addSkills(["yjzhian", "yjqingzheng", "rehujia"]); }, }, effect: { @@ -507,69 +518,93 @@ const skills = { forced: true, locked: false, filter(event, player) { - return get.itemtype(event.cards) == "cards" && game.getAllGlobalHistory( - "everything", - evt => { - return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player) === get.suit(event?.card, player); - }, - event - ).length === 1 + return ( + get.itemtype(event.cards) == "cards" && + game.getAllGlobalHistory( + "everything", + evt => { + return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player) === get.suit(event?.card, player); + }, + event + ).length === 1 + ); }, async content(event, trigger, player) { trigger.cancel(); - player.addTip("yjdaojue", "道抉 " + game.getAllGlobalHistory( - "everything", - evt => { - return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player); - }, - trigger - ).map(c => get.suit(c?.card, player)).unique().reduce((str, i) => str + get.translation(i), "")) + player.addTip( + "yjdaojue", + "道抉 " + + game + .getAllGlobalHistory( + "everything", + evt => { + return evt.name == "damage" && evt.player == player && get.suit(evt?.card, player); + }, + trigger + ) + .map(c => get.suit(c?.card, player)) + .unique() + .reduce((str, i) => str + get.translation(i), "") + ); const card = trigger.cards.filter(c => get.position(c, true) === "o"); if (!card.length) { if (player.hasUsableCard("sha", "use")) { await player - .chooseToUse(function (card, player, event) { - if (get.name(card) !== "sha") { - return false; - } - return lib.filter.filterCard.apply(this, arguments); - }, "对所有角色使用一张杀", true) + .chooseToUse( + function (card, player, event) { + if (get.name(card) !== "sha") { + return false; + } + return lib.filter.filterCard.apply(this, arguments); + }, + "对所有角色使用一张杀", + true + ) .set("targetRequired", true) .set("complexSelect", true) .set("selectTarget", -1) .set("filterTarget", function (card, player, target) { return lib.filter.targetEnabled.apply(this, arguments); - }) - return + }); + return; } } const result = await player - .chooseControlList( - get.prompt(event.name), - ["获得" + get.translation(card), "使用一张指定所有其他角色的【杀】。"], true) + .chooseControlList(get.prompt(event.name), ["获得" + get.translation(card), "使用一张指定所有其他角色的【杀】。"], true) .set("ai", () => { - if (get.event("card").map(c => get.value(c)).reduce((sum, cur) => sum + cur, 0) > 4) { + if ( + get + .event("card") + .map(c => get.value(c)) + .reduce((sum, cur) => sum + cur, 0) > 4 + ) { return 0; } else { return 1; } - }).set("card", card).forResult(); + }) + .set("card", card) + .forResult(); if (result.index === 0) { - await player.gain(card, "gain2", "log") + await player.gain(card, "gain2", "log"); } else if (player.hasUsableCard("sha", "use")) { await player - .chooseToUse(function (card, player, event) { - if (get.name(card) !== "sha") { - return false; - } - return lib.filter.filterCard.apply(this, arguments); - }, "对所有角色使用一张杀", true) + .chooseToUse( + function (card, player, event) { + if (get.name(card) !== "sha") { + return false; + } + return lib.filter.filterCard.apply(this, arguments); + }, + "对所有角色使用一张杀", + true + ) .set("targetRequired", true) .set("complexSelect", true) .set("selectTarget", -1) .set("filterTarget", function (card, player, target) { return lib.filter.targetEnabled.apply(this, arguments); - }) + }); } }, }, @@ -592,26 +627,20 @@ const skills = { async cost(event, trigger, player) { const cards = trigger.cards?.filterInD("ejod") || []; let list = ["选项一", "选项二", "选项三", "cancel2"], - choiceList = [ - `弃置一张手牌${cards.length ? `并获得${get.translation(cards)}` : ""}`, - "回复1点体力,此技能本轮失效", - `对${get.translation(trigger.player)}造成${get.cnNumber(Math.max(1, player.getDamagedHp()))}点伤害,获得〖飞影〗并删去此项`, - ]; + choiceList = [`弃置一张手牌${cards.length ? `并获得${get.translation(cards)}` : ""}`, "回复1点体力,此技能本轮失效", `对${get.translation(trigger.player)}造成${get.cnNumber(Math.max(1, player.getDamagedHp()))}点伤害,获得〖飞影〗并删去此项`]; let choice = "cancel2"; if (player.isDamaged()) { if (player.hp <= 1) { choice = "选项二"; } - } - else { + } else { list.remove("选项二"); choiceList[1] = `${choiceList[1]}`; } if (!player.countCards("h")) { list.remove("选项一"); choiceList[0] = `${choiceList[0]}`; - } - else { + } else { if (cards.length && player.hp > 1) { let result = 0, card = trigger.card, @@ -623,12 +652,17 @@ const skills = { } else { result += (get.value(card, owner) - 0.01) * get.sgn(get.attitude(player, owner)); } - } - else { + } else { result += cards.reduce((sum, i) => sum + get.value(i, player), 0); } result -= get.recoverEffect(player); - if (result > player.getCards("h").map(i => get.value(i)).minBy(i => i)) { + if ( + result > + player + .getCards("h") + .map(i => get.value(i)) + .minBy(i => i) + ) { choice = "选项一"; } } @@ -636,8 +670,7 @@ const skills = { if (player.hasSkill("yjzhian_delete")) { list.remove("选项三"); choiceList[2] = `${choiceList[2]}`; - } - else if (get.damageEffect(trigger.player, player) > 0 && choice == "cancel2") { + } else if (get.damageEffect(trigger.player, player) > 0 && choice == "cancel2") { choice = "选项三"; } const result = await player @@ -771,17 +804,20 @@ const skills = { if (!skills.length) { return; } - const result = skills.length > 1 ? await player - .chooseButton(["脱难:失去一个有标签的技能", [skills, "skill"]], true) - .set("displayIndex", false) - .set("ai", button => { - const { link } = button; - if (link == "petuonan") { - return 2; - } - return 1; - }) - .forResult() : { bool: true, links: skills }; + const result = + skills.length > 1 + ? await player + .chooseButton(["脱难:失去一个有标签的技能", [skills, "skill"]], true) + .set("displayIndex", false) + .set("ai", button => { + const { link } = button; + if (link == "petuonan") { + return 2; + } + return 1; + }) + .forResult() + : { bool: true, links: skills }; if (result?.bool && result?.links?.length) { await player.removeSkills(result.links); } @@ -3013,6 +3049,9 @@ const skills = { if (get.is.playerNames(target, "zombie_zombie")) { return false; } + if (event.reserveOut) { + return false; + } return player.hasAllHistory("useSkill", evt => { if (evt.type !== "player") { return false; @@ -3051,7 +3090,7 @@ const skills = { .forResult() : { control: names[0] }; if (result.control) { - target.revive(2); + await target.revive(2); let doubleDraw = false; let num = (get.character("zombie_zombie").maxHp || get.character("zombie_zombie").hp) - (get.character(result.control).maxHp || get.character(result.control).hp); if (num !== 0) { @@ -3257,12 +3296,14 @@ const skills = { const getEnemies = function (func, includeDie) { if (this["zombieshibian"]) { return this["zombieshibian"].getEnemies(func, includeDie); - } - else { + } else { const player = this; - return [...origin_getEnemies.apply(this, arguments), ...game[includeDie ? "filterPlayer2" : "filterPlayer"](target => { - return origin_getEnemies.apply(this, arguments).includes(target["zombieshibian"] || target); - })] + return [ + ...origin_getEnemies.apply(this, arguments), + ...game[includeDie ? "filterPlayer2" : "filterPlayer"](target => { + return origin_getEnemies.apply(this, arguments).includes(target["zombieshibian"] || target); + }), + ] .filter(i => player != (i["zombieshibian"] || i)) .unique() .sortBySeat(player); diff --git a/character/rank.js b/character/rank.js index 12352ae759..7a0ce42057 100644 --- a/character/rank.js +++ b/character/rank.js @@ -1161,6 +1161,7 @@ window.noname_character_rank = { "xin_panzhangmazhong", "sp_mifuren", "xin_caozhen", + "tw_yanpu", "yanpu", "re_xiahoushi", "tw_caocao", @@ -1206,6 +1207,8 @@ window.noname_character_rank = { "duanwei", "wangjun", "xin_zhuzhi", + "tw_zhuzhi", + "tw_zhuzhi", "tw_xiahouen", "tw_yl_luzhi", "re_zhangsong", @@ -2278,6 +2281,7 @@ window.noname_character_rank = { "sb_liubei", "sb_fazheng", "sb_chengong", + "tw_sb_chengong", "sb_yuanshao", "sb_pangtong", "sb_xiaoqiao", @@ -2697,6 +2701,7 @@ window.noname_character_rank = { "sxrm_caocao", ], epic: [ + "yj_caocaoyuanshao", "v_caopi", "ca_lijue", "dc_sb_liuxie", @@ -4145,6 +4150,7 @@ window.noname_character_rank = { "ruanhui", "re_wuguotai", "yanpu", + "tw_yanpu", "xin_caozhen", "xin_guyong", "ol_yujin", @@ -4530,6 +4536,7 @@ window.noname_character_rank = { "sb_ganning", "sb_jiangwei", "sb_chengong", + "tw_sb_chengong", "sb_yuanshao", "sb_pangtong", "sb_menghuo", diff --git a/character/refresh/skill.js b/character/refresh/skill.js index aa2f8171f4..1488dc5dea 100644 --- a/character/refresh/skill.js +++ b/character/refresh/skill.js @@ -2251,7 +2251,7 @@ const skills = { result = await trigger.source.chooseToDiscard("智愚:请弃置一张手牌", true).forResult(); } let cards = player.getCards("h"); - const bool = cards.map(card => get.color(card, player)).unique(); + const bool = cards.map(card => get.color(card, player)).unique().length == 1; if (bool) { cards = result.cards.filterInD("d"); if (cards.length) { diff --git a/character/replace.js b/character/replace.js index 9918dc26a7..d2ef166542 100644 --- a/character/replace.js +++ b/character/replace.js @@ -48,7 +48,7 @@ window.noname_character_replace = { chendao: ["chendao", "pot_chendao", "ns_chendao", "old_chendao"], chendeng: ["chendeng", "ol_chendeng", "re_chendeng", "jsrg_chendeng"], chendong: ["chendong", "sp_chendong", "tw_chendong"], - chengong: ["chengong", "re_chengong", "sb_chengong"], + chengong: ["chengong", "re_chengong", "sb_chengong", "tw_sb_chengong"], chengpu: ["chengpu", "ol_chengpu", "xin_chengpu", "re_chengpu", "tw_chengpu", "std_chengpu", "ns_chengpu"], chengui: ["chengui", "mb_chengui"], chengyu: ["chengyu", "dc_sb_chengyu", "std_chengyu"], @@ -356,7 +356,7 @@ window.noname_character_replace = { zhuling: ["ol_zhuling", "dc_zhuling", "zhuling"], zhuran: ["zhuran", "re_zhuran", "xin_zhuran", "old_zhuran"], zhurong: ["zhurong", "ol_zhurong", "re_zhurong", "sb_zhurong", "dc_sp_zhurong"], - zhuzhi: ["zhuzhi", "re_zhuzhi", "xin_zhuzhi", "old_zhuzhi"], + zhuzhi: ["zhuzhi", "re_zhuzhi", "xin_zhuzhi", "tw_zhuzhi", "old_zhuzhi"], zongyu: ["zongyu", "sp_zongyu", "tw_zongyu"], zoushi: ["zoushi", "re_zoushi", "yue_zoushi", "jsrg_zoushi", "std_zoushi"], zumao: ["zumao", "tw_zumao"], @@ -415,4 +415,5 @@ window.noname_character_replace = { zerong: ["zerong", "std_zerong"], tw_zhugejun: ["tw_zhugejun", "dc_zhugejun"], wufu: ["wufu", "hr_wufu"], + yanpu: ["yanpu", "tw_yanpu"], }; diff --git a/character/sb/skill.js b/character/sb/skill.js index 3f28f13f90..943dd8e9af 100644 --- a/character/sb/skill.js +++ b/character/sb/skill.js @@ -74,7 +74,7 @@ const skills = { }, popup: false, async cost(event, trigger, player) { - event.result = await player.gainPlayerCard(get.prompt2(event.skill), trigger.player, "hej", [1, trigger.num]).set("chooseOnly", true).forResult(); + event.result = await player.gainPlayerCard(get.prompt2(event.skill), trigger.player, "hej", [1, trigger.num]).set("chooseonly", true).forResult(); }, async content(event, trigger, player) { const cards = event.cards; @@ -5695,35 +5695,36 @@ const skills = { delay: false, onremove: true, group: "sbmingce_hit", - content() { - "step 0"; - player.give(cards, target); - "step 1"; - var choices = ["选项二"]; - var choiceList = ["失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", "摸一张牌"]; + async content(event, trigger, player) { + const { cards } = event, + { target } = event; + await player.give(cards, target); + let choices = ["选项二"], + choiceList = ["失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", "摸一张牌"]; if (target.hp > 0) { choices.unshift("选项一"); } else { choiceList[0] = '' + choiceList[0] + ""; } - target + const result = await target .chooseControl(choices) .set("choiceList", choiceList) .set("prompt", get.translation(player) + "对你发动了【明策】,请选择一项") .set("ai", () => { return _status.event.choice; }) - .set("choice", target.hp <= 0 || (((target.hp + target.countCards("hs", "tao") > 2 && get.attitude(target, player) > 0) || get.effect(target, { name: "losehp" }, target, target) > 0) && target.hp > 0) ? 0 : 1); - "step 2"; + .set("choice", target.hp <= 0 || (((target.hp + target.countCards("hs", "tao") > 2 && get.attitude(target, player) > 0) || get.effect(target, { name: "losehp" }, target, target) > 0) && target.hp > 0) ? 0 : 1) + .forResult(); + if (!result) { + return; + } if (result.control == "选项一") { - target.loseHp(); - player.draw(2); + await target.loseHp(); + await player.draw(2); + player.addMark("sbmingce", 1); } else { - target.draw(); - event.finish(); + await target.draw(); } - "step 3"; - player.addMark("sbmingce", 1); }, marktext: "笨", intro: { @@ -5746,27 +5747,26 @@ const skills = { filter(event, player) { return player.hasMark("sbmingce"); }, - direct: true, - content() { - "step 0"; - var num = player.countMark("sbmingce"); - event.num = num; - player.chooseTarget(get.prompt("sbmingce"), "移去所有“策”,对一名其他角色造成" + num + "点伤害", lib.filter.notMe).set("ai", target => { - var player = _status.event.player; - var eff = get.damageEffect(target, player, player); - var num = player.countMark("sbmingce"); - if (target.hasSkillTag("filterDamage", null, { player: player })) { - num = 1; - } - return eff * num; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("sbmingce_hit", target); - player.removeMark("sbmingce", num); - target.damage(num); - } + async cost(event, trigger, player) { + const num = player.countMark("sbmingce"); + event.result = await player + .chooseTarget(get.prompt("sbmingce"), "移去所有“策”,对一名其他角色造成" + num + "点伤害", lib.filter.notMe) + .set("ai", target => { + var player = _status.event.player; + var eff = get.damageEffect(target, player, player); + var num = player.countMark("sbmingce"); + if (target.hasSkillTag("filterDamage", null, { player: player })) { + num = 1; + } + return eff * num; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + num = player.countMark("sbmingce"); + player.removeMark("sbmingce", num); + await target.damage(num); }, }, }, @@ -5775,7 +5775,7 @@ const skills = { audio: 2, trigger: { player: "damageEnd" }, forced: true, - content() { + async content(event, trigger, player) { player.addTempSkill("sbzhichi_muteki"); }, subSkill: { @@ -5785,7 +5785,7 @@ const skills = { charlotte: true, forced: true, group: "sbzhichi_egg", - content() { + async content(event, trigger, player) { trigger.cancel(); }, mark: true, @@ -5811,7 +5811,7 @@ const skills = { forced: true, silent: true, forceDie: true, - content() { + async content(event, trigger, player) { player.chat("你是真滴牛批"); }, }, @@ -10436,36 +10436,38 @@ const skills = { return; } do { - const { result } = cards.length > 1 ? await player - .chooseButtonTarget({ - createDialog: [`连营:请选择要分配的牌和目标`, cards], - forced: true, - selectButton: [1, Infinity], - cardsx: cards, - ai1(button) { - return get.value(button.link); - }, - ai2(target) { - const player = get.player(); - const card = ui.selected.buttons[0].link; - if (card) { - return get.value(card, target) * get.attitude(player, target); - } - return 1; - }, - }) : await player - .chooseTarget("选择一名角色获得" + get.translation(cards), true) - .set("ai", target => { - const att = get.attitude(_status.event.player, target); - if (_status.event.enemy) { - return -att; - } else if (att > 0) { - return att / (1 + target.countCards("h")); - } else { - return att / 100; - } - }) - .set("enemy", get.value(cards[0], player, "raw") < 0); + const { result } = + cards.length > 1 + ? await player.chooseButtonTarget({ + createDialog: [`连营:请选择要分配的牌和目标`, cards], + forced: true, + selectButton: [1, Infinity], + cardsx: cards, + ai1(button) { + return get.value(button.link); + }, + ai2(target) { + const player = get.player(); + const card = ui.selected.buttons[0].link; + if (card) { + return get.value(card, target) * get.attitude(player, target); + } + return 1; + }, + }) + : await player + .chooseTarget("选择一名角色获得" + get.translation(cards), true) + .set("ai", target => { + const att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(cards[0], player, "raw") < 0); if (result.bool) { if (!result.links?.length) { result.links = cards.slice(0); diff --git a/character/sixiang/skill.js b/character/sixiang/skill.js index 439ebefdfa..1f02aacf84 100644 --- a/character/sixiang/skill.js +++ b/character/sixiang/skill.js @@ -102,14 +102,20 @@ const skills = { backup(links, player) { return { audio: "fjzhitu", - filterCard: true, + filterCard(card, player) { + const selected = ui.selected.cards; + if (!selected.length) { + return true; + } + return get.number(card, player) + selected.reduce((sum, card) => (sum + get.number(card, get.player())), 0) <= 13; + }, selectCard: [2, Infinity], filterOk() { const selected = ui.selected.cards; if (!selected.length) { return false; } - return selected.reduce((sum, card) => (sum += get.number(card, get.player())), 0) >= 13; + return selected.reduce((sum, card) => (sum + get.number(card, get.player())), 0) == 13; }, ai1(card) { const player = get.player(); diff --git a/character/sp/skill.js b/character/sp/skill.js index 24fc34f59d..491d4cda82 100644 --- a/character/sp/skill.js +++ b/character/sp/skill.js @@ -150,6 +150,9 @@ const skills = { }, //OL张曼成 —— by 星の语 olkuangxin: { + init(player) { + player.addSkill("olkuangxin_record"); + }, audio: 2, trigger: { player: "phaseUseBegin" }, forced: true, @@ -187,6 +190,42 @@ const skills = { intro: { content: "上次展示了#张牌", }, + group: ["olkuangxin_recover"], + subSkill: { + record: { + trigger: { player: ["phaseZhunbeiAfter", "phaseBefore", "enterGame"] }, + lastDo: true, + charlotte: true, + forced: true, + popup: false, + forceDie: true, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + content() { + if (!_status.olkuangxin) { + _status.olkuangxin = {}; + } + _status.olkuangxin = player.hp; + }, + }, + recover: { + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return _status.olkuangxin > 0; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + const num = _status.olkuangxin - player.hp; + if (num > 0) { + await player.recover(num); + } else if (num < 0) { + await player.loseHp(num); + } + }, + }, + }, }, olleishi: { audio: 2, @@ -222,9 +261,7 @@ const skills = { return; } const resultx = await player - .chooseTarget(`雷噬:对一名目标角色造成一点雷电伤害`, true, (card, player, target) => { - return get.event().targets.includes(target); - }) + .chooseTarget(`雷噬:对一名角色造成一点雷电伤害`, true) .set("targets", targets) .set("ai", target => get.damageEffect(target, get.player(), get.player(), "thunder")) .forResult(); @@ -1322,7 +1359,7 @@ const skills = { .set("target", target) .forResult("bool"); if (!bool) { - await player.damage(1, target); + await player.damage(1, target, "thunder"); } }, }, @@ -35476,39 +35513,42 @@ const skills = { }); } do { - const { result } = cards.length > 1 ? await player - .chooseButtonTarget({ - createDialog: [`礼让:是否分配本次弃置的牌?`, cards], - selectButton: [1, Infinity], - cardsx: cards, - filterTarget: lib.filter.notMe, - ai1(button) { - return get.value(button.link); - }, - canHidden: true, - ai2(target) { - const player = get.player(); - const card = ui.selected.buttons[0].link; - if (card) { - return get.value(card, target) * get.attitude(player, target); - } - return 1; - }, - }) - .setHiddenSkill("lirang") : await player - .chooseTarget(`礼让:是否令一名角色获得${get.translation(cards)}?`, lib.filter.notMe) - .set("ai", target => { - const att = get.attitude(_status.event.player, target); - if (_status.event.enemy) { - return -att; - } else if (att > 0) { - return att / (1 + target.countCards("h")); - } else { - return att / 100; - } - }) - .setHiddenSkill("lirang") - .set("enemy", get.value(cards[0], player, "raw") < 0); + const { result } = + cards.length > 1 + ? await player + .chooseButtonTarget({ + createDialog: [`礼让:是否分配本次弃置的牌?`, cards], + selectButton: [1, Infinity], + cardsx: cards, + filterTarget: lib.filter.notMe, + ai1(button) { + return get.value(button.link); + }, + canHidden: true, + ai2(target) { + const player = get.player(); + const card = ui.selected.buttons[0].link; + if (card) { + return get.value(card, target) * get.attitude(player, target); + } + return 1; + }, + }) + .setHiddenSkill("lirang") + : await player + .chooseTarget(`礼让:是否令一名角色获得${get.translation(cards)}?`, lib.filter.notMe) + .set("ai", target => { + const att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .setHiddenSkill("lirang") + .set("enemy", get.value(cards[0], player, "raw") < 0); if (result?.bool) { if (!result.links?.length) { result.links = cards.slice(0); @@ -35519,8 +35559,7 @@ const skills = { give_map[id] = []; } give_map[id].addArray(result.links); - } - else { + } else { break; } } while (cards.length > 0); @@ -35541,14 +35580,16 @@ const skills = { bool: targets.length > 0, targets: targets?.sortBySeat(), cost_data: lose_list, - } + }; }, async content(event, trigger, player) { - await game.loseAsync({ - gain_list: event.cost_data, - giver: player, - animate: "gain2", - }).setContent("gaincardMultiple"); + await game + .loseAsync({ + gain_list: event.cost_data, + giver: player, + animate: "gain2", + }) + .setContent("gaincardMultiple"); }, ai: { expose: 0.1, diff --git a/character/sp/translate.js b/character/sp/translate.js index 35dbedfca9..6529cd321d 100644 --- a/character/sp/translate.js +++ b/character/sp/translate.js @@ -1513,10 +1513,10 @@ const translates = { ol_zhangmancheng: "OL张曼成", ol_zhangmancheng_prefix: "OL", olkuangxin: "狂信", - olkuangxin_info: "锁定技,出牌阶段开始时,你失去任意点体力,摸等量的牌并展示已损失体力值+1张手牌。", + olkuangxin_info: "锁定技,出牌阶段开始时,你失去任意点体力,摸等量的牌并展示已损失体力值+1张手牌。结束阶段,你调整体力值与上个准备阶段结束后相同。", olleishi: "雷噬", olleishi_judge: "雷噬·判定", - olleishi_info: "出牌阶段限X次(X为你上次发动〖狂信〗展示牌的数量),你使用本回合展示过的牌结算完成后,可进行一次判定并获得判定牌,若判定结果与使用牌的花色:相同,你对一名目标角色造成一点雷电伤害;不同,你展示一张牌,本回合下次判定时,若此牌在你的手牌区内,将此牌作为判定牌。", + olleishi_info: "出牌阶段限X次(X为你上次发动〖狂信〗展示牌的数量),你使用本回合展示过的牌结算完成后,可进行一次判定并获得判定牌,若判定结果与使用牌的花色:相同,你对一名角色造成一点雷电伤害;不同,你展示一张牌,本回合下次判定时,若此牌在你的手牌区内,将此牌作为判定牌。", ol_caizhenji: "OL蔡贞姬", ol_caizhenji_prefix: "OL", olkedi: "柯笛", diff --git a/character/sxrm/intro.js b/character/sxrm/intro.js index 134b627abe..5d819fc77f 100644 --- a/character/sxrm/intro.js +++ b/character/sxrm/intro.js @@ -1,5 +1,6 @@ const characterIntro = { - sxrm_caocao: " “将军,魏王邀你去回忆中一叙。” 
“眼见未必为真,请务必保持清醒。”", + sxrm_wanghou: "王垕是罗贯中创作的小说《三国演义》及其衍生作品中的角色,于小说第十七回登场,为曹操征讨袁术时管粮官任峻部下仓官,后被曹操冤杀。人名不见于正史记载,事件原型源于《三国志》裴松之注引的《曹瞒传》。", + sxrm_caocao: " “将军,魏王邀你去回忆中一叙。” 
“眼见未必为真,请务必保持清醒。”", }; export default characterIntro; diff --git a/character/tw/character.js b/character/tw/character.js index 36ab5f2c30..3867cf4f50 100644 --- a/character/tw/character.js +++ b/character/tw/character.js @@ -1,4 +1,28 @@ const characters = { + tw_sb_chengong: { + sex: "male", + group: "qun", + hp: 3, + skills: ["twmingce", "sbzhichi"], + dieAudios: ["sb_chengong"], + img: "image/character/sb_chengong.jpg", + }, + tw_yanpu: { + sex: "male", + group: "qun", + hp: 3, + skills: ["twhuantu", "twbihuo"], + dieAudios: ["yanpu"], + img: "image/character/yanpu.jpg", + }, + tw_zhuzhi: { + sex: "male", + group: "wu", + hp: 4, + skills: ["twanguo"], + dieAudios: ["xin_zhuzhi"], + img: "image/character/xin_zhuzhi.jpg", + }, huan_dianwei: { sex: "male", group: "wei", diff --git a/character/tw/skill.js b/character/tw/skill.js index 276ab41832..b36dc74d7e 100644 --- a/character/tw/skill.js +++ b/character/tw/skill.js @@ -2,6 +2,524 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //TW朱治 + twanguo: { + audio: "sbanguo", + trigger: { global: "phaseBefore", player: "enterGame" }, + group: ["twanguo_move", "twanguo_draw", "twanguo_dying"], + logAudio: () => 2, + filter(event, player) { + return game.hasPlayer(current => current != player) && (event.name != "phase" || game.phaseNumber == 0); + }, + async cost(event, trigger, player) { + event.result = await player.chooseTarget("安国:令一名其他角色获得“安国”标记", lib.filter.notMe, true).forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + target.markAuto(event.name + "_effect", ["draw", "handcard", "dying"]); + target.addMark(event.name + "_mark", 1); + target.addAdditionalSkill(event.name + "_" + player.playerid, event.name + "_mark"); + }, + subSkill: { + mark: { + onremove: ["twanguo_mark", "twanguo_effect"], + marktext: "安", + charlotte: true, + intro: { + name: "安国", + name2: "安国", + content(storage, player, skill) { + let str = "目前拥有的效果:"; + const effect = player.getStorage("twanguo_effect"); + if (!effect?.length) { + str += "
无"; + } else { + effect.forEach(name => { + switch (name) { + case "draw": + str += "
  • 摸牌阶段额外摸一张牌"; + break; + case "handcard": + str += "
  • 手牌上限等于其体力上限"; + break; + case "dying": + str += "
  • 脱离濒死状态后,摸一张牌"; + break; + } + }); + } + return str; + }, + }, + forced: true, + trigger: { player: ["phaseDrawBegin1", "dyingAfter"] }, + filter(event, player) { + const storage = player.getStorage("twanguo_effect"); + if (event.name == "phaseDraw") { + return !event.numFixed && storage.includes("draw"); + } + return storage.includes("dying"); + }, + async content(event, trigger, player) { + if (trigger.name == "phaseDraw") { + trigger.num++; + } else { + await player.draw(); + } + }, + mod: { + maxHandcardBase(player, num) { + if (player.getStorage("twanguo_effect").includes("handcard")) { + return player.maxHp; + } + return num; + }, + }, + }, + move: { + audio: ["sbanguo1.mp3", "sbanguo2.mp3"], + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return game.hasPlayer(current => current.hasSkill("twanguo_mark")) && game.hasPlayer(current => !current.hasMark("twanguo_mark") && current != player); + }, + async cost(event, trigger, player) { + const targets = game.filterPlayer(current => current.hasSkill("twanguo_mark")); + const prompt2 = targets.length == 1 ? "将" + get.translation(targets[0]) + "的“安国”交给一名其他角色" : "选择一名有“安国”的角色,将该标记交给一名未拥有“安国”的其他角色"; + const result = await player + .chooseTarget(get.prompt("twanguo"), prompt2, targets.length == 1 ? 1 : 2, (card, player, target) => { + if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) { + return target.hasSkill("twanguo_mark"); + } + return !target.hasMark("twanguo_mark") && target != player; + }) + .set("ai", target => { + var player = _status.event.player; + if (ui.selected.targets.length == 0 && _status.event.targets.length > 1) { + return -get.attitude(player, target); + } + return get.attitude(player, _status.event.targets[0]) < get.attitude(player, target); + }) + .set("targets", targets) + .set("animate", false) + .forResult(); + event.result = { + bool: result?.bool, + cost_data: result?.targets, + }; + }, + async content(event, trigger, player) { + const targets = event.cost_data; + let target1, target2; + if (targets.length == 1) { + target1 = game.filterPlayer(current => current.hasSkill("twanguo_mark"))[0]; + target2 = targets[0]; + } else { + target1 = targets[0]; + target2 = targets[1]; + } + player.line2([target1, target2], "green"); + const map = target1.additionalSkills; + for (const key in map) { + if (key.indexOf("twanguo_") != 0) { + continue; + } + const id = parseInt(key.slice(8)); + target2.markAuto("twanguo_effect", target1.getStorage("twanguo_effect")); + target1.removeAdditionalSkill("twanguo_" + id); + target2.addMark("twanguo_mark", 1); + target2.addAdditionalSkill("twanguo_" + id, "twanguo_mark"); + } + }, + }, + draw: { + audio: ["sbanguo1.mp3", "sbanguo2.mp3"], + enable: "phaseUse", + usable: 1, + prompt: "摸等同于一名拥有“安国”标记的角色已损失体力值张牌,并交给其等量的牌", + filter(event, player) { + return game.hasPlayer(target => target.hasMark("twanguo_mark") && target.isDamaged()); + }, + filterTarget(card, player, target) { + return target.hasMark("twanguo_mark") && target.isDamaged(); + }, + async content(event, trigger, player) { + const { target } = event, + num = target.getDamagedHp(); + await player.draw(num); + await player.chooseToGive(target, num, "he", true); + }, + ai: { + order: 7, + result: { + target: 1, + }, + }, + }, + dying: { + audio: "sbanguo3.mp3", + trigger: { global: "dying" }, + filter(event, player) { + const skill = "twanguo_effect"; + if (event.player == player) { + return game.hasPlayer(target => target.getStorage(skill).length > 0); + } + if (event.player.hasMark("twanguo_mark")) { + return event.player.getStorage(skill).length > 0; + } + return false; + }, + logTarget: "player", + async cost(event, trigger, player) { + const createDialog = [ + `###${get.prompt(event.skill, trigger.player)}###移去一个效果令其将体力回复至1点`, + [ + [ + ["draw", "摸牌阶段额外摸一张牌"], + ["handcard", "手牌上限等于其体力上限"], + ["dying", "脱离濒死状态后,摸一张牌"], + ], + "textbutton", + ], + ], + target = trigger.player; + if (trigger.player == player) { + const result = await player + .chooseButtonTarget({ + createDialog: createDialog, + filterButton(button) { + return game.hasPlayer(target => target.getStorage("twanguo_effect").includes(button.link)); + }, + complexTarget: true, + filterTarget(card, player, target) { + const link = ui.selected.buttons?.[0]?.link; + if (link) { + return target.getStorage("twanguo_effect").includes(link); + } + return false; + }, + ai1(button) { + switch (button.link) { + case "draw": + return 4; + case "handcard": + return 3; + case "dying": + return 5; + } + }, + ai2(target) { + const player = get.player(), + att = get.attitude(player, target), + link = ui.selected.buttons?.[0]?.link; + if (!link) { + return 0; + } + if (att < 0) { + return -att + 2; + } + if ( + player.countCards("h", function (card) { + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") { + return mod2; + } + const mod = game.checkMod(card, player, player, "unchanged", "cardSavable", player); + if (mod != "unchanged") { + return mod; + } + let savable = get.info(card).savable; + if (typeof savable == "function") { + savable = savable(card, player, player); + } + return savable; + }) >= + 1 - player.hp + ) { + return 0; + } + return 1; + }, + }) + .forResult(); + event.result = { + bool: result?.bool, + cost_data: { + link: result?.links?.[0], + remover: result?.targets?.[0], + }, + }; + } else { + const result = await player + .chooseButton(createDialog) + .set("filterButton", button => { + return get.event().targetx.getStorage("twanguo_effect").includes(button.link); + }) + .set("targetx", target) + .set("ai", button => { + const player = get.player(), + target = get.event().targetx, + att = get.attitude(player, target); + if ( + att <= 0 || + player.countCards("h", function (card) { + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") { + return mod2; + } + const mod = game.checkMod(card, player, target, "unchanged", "cardSavable", player); + if (mod != "unchanged") { + return mod; + } + let savable = get.info(card).savable; + if (typeof savable == "function") { + savable = savable(card, player, target); + } + return savable; + }) >= + 1 - target.hp + ) { + return 0; + } + switch (button.link) { + case "draw": + return 4; + case "handcard": + return 3; + case "dying": + return 5; + } + }) + .forResult(); + event.result = { + bool: result?.bool, + cost_data: { + link: result?.links?.[0], + }, + }; + } + }, + async content(event, trigger, player) { + const link = event.cost_data.link; + let remover; + if (event.cost_data.remover) { + remover = event.cost_data.remover; + } else { + remover = trigger.player; + } + player.line(remover); + remover.unmarkAuto("twanguo_effect", link); + await trigger.player.recoverTo(1); + }, + }, + }, + }, + //TW阎圃 + twhuantu: { + audio: "huantu", + trigger: { global: "phaseDrawBefore" }, + round: 1, + filter(event, player) { + return player.countCards("he") > 0 && event.player != player; + }, + checkx(event, player) { + const target = event.player; + return get.attitude(player, target) > 0 && (target.hasSkill("pingkou") || target.skipList.includes("phaseUse") || (target.isDamaged() && target.hp <= 2) || target.needsToDiscard()); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseCard(get.prompt(event.skill, trigger.player), "交给其一张牌并令其暂时跳过摸牌阶段", "he") + .set("ai", function (card) { + if (!_status.event.checkx) { + return 0; + } + return 1 + Math.random(); + }) + .set("checkx", lib.skill.huantu.checkx(trigger, player)) + .forResult(); + }, + logTarget: "player", + async content(event, trigger, player) { + const target = event.targets[0], + { cards } = event; + await player.give(cards, target); + trigger.cancel(); + player.addTempSkill(event.name + "_effect"); + }, + subSkill: { + effect: { + audio: "huantu", + trigger: { global: "phaseJieshuBegin" }, + forced: true, + charlotte: true, + logTarget: "player", + filter(event, player) { + return event.player.isIn(); + }, + async content(event, trigger, player) { + const target = trigger.player, + str = get.translation(target); + const result = await player + .chooseControl() + .set("choiceList", ["令" + str + "回复1点体力并摸两张牌", "摸三张牌,然后交给" + str + "两张手牌"]) + .set("choice", target.isDamaged() ? 0 : 1) + .forResult(); + const funcs = [ + async function () { + await target.recover(); + await target.draw(2); + }, + async function () { + await player.draw(3); + if (player.countCards("h") && target.isIn()) { + await player.chooseToGive(target, "h", 2, true); + } + }, + ]; + await funcs[result?.index]?.(); + if (!target.hasHistory("sourceDamage", evt => evt.num) && player.inRange(target)) { + await funcs[[1, 0][result?.index]]?.(); + } + }, + }, + }, + }, + twbihuo: { + audio: "bihuo", + trigger: { global: "dyingAfter" }, + logTarget: "player", + limited: true, + skillAnimation: true, + animationColor: "gray", + filter(event, player) { + return event.player.isIn(); + }, + check(event, player) { + return get.attitude(player, event.player) > 0; + }, + async content(event, trigger, player) { + const target = trigger.player, + skill = event.name + "_effect"; + player.awakenSkill(event.name); + await target.draw(3); + target.addTempSkill(skill, "roundStart"); + target.addMark(skill, Math.max(3, game.countPlayer()), false); + }, + subSkill: { + effect: { + onremove: true, + charlotte: true, + mod: { + globalTo(from, to, distance) { + return distance + to.countMark("twbihuo_effect"); + }, + }, + intro: { content: "其他角色至你的距离+#" }, + }, + }, + }, + //谋陈宫 + twmingce: { + audio: "sbmingce", + enable: "phaseUse", + position: "he", + filter(event, player) { + return player.countCards("he") > 0 && player.getStorage("twmingce_used").length < 2; + }, + filterCard: true, + check(card) { + return 8 - get.value(card); + }, + filterTarget: lib.filter.notMe, + selectTarget: 1, + discard: false, + lose: false, + delay: false, + onremove: true, + group: "twmingce_hit", + async content(event, trigger, player) { + const { cards } = event, + { target } = event, + name = "twmingce_used", + storage = player.getStorage(name); + await player.give(cards, target); + let choices = ["选项一", "选项二"], + choiceList = ["失去1点体力,令" + get.translation(player) + "摸两张牌并获得1枚“策”", "摸一张牌"]; + storage.forEach(num => { + choices.remove(`选项${get.cnNumber(num + 1)}`); + choiceList[num] = '' + choiceList[num] + ""; + }); + const result = await target + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", get.translation(player) + "对你发动了【明策】,请选择一项") + .set("ai", () => { + return _status.event.choice; + }) + .set("choice", target.hp <= 0 || (((target.hp + target.countCards("hs", "tao") > 2 && get.attitude(target, player) > 0) || get.effect(target, { name: "losehp" }, target, target) > 0) && target.hp > 0) ? 0 : 1) + .forResult(); + if (!result) { + return; + } + const extra = storage.length < 1 ? 1 : 0; + player.addTempSkill(name, ["phaseChange", "phaseUseAfter"]); + player.markAuto(name, ["选项一", "选项二"].indexOf(result.control)); + if (result.control == "选项一") { + await target.loseHp(); + await player.draw(2 + extra); + player.addMark(event.name, 1); + } else { + await target.draw(1 + extra); + } + }, + marktext: "笨", + intro: { + name: "策(明策)", + name2: "策", + content: "mark", + }, + ai: { + result: { + player: 0.5, + target: 1, + }, + order: 8.5, + expose: 0.2, + }, + subSkill: { + used: { + charlotte: true, + onremove: true, + }, + hit: { + audio: "sbmingce", + trigger: { player: "phaseUseBegin" }, + filter(event, player) { + return player.hasMark("twmingce"); + }, + async cost(event, trigger, player) { + const num = player.countMark("twmingce"); + event.result = await player + .chooseTarget(get.prompt(event.skill), "移去所有“策”,对一名其他角色造成" + num + "点伤害", lib.filter.notMe) + .set("ai", target => { + const player = _status.event.player; + const eff = get.damageEffect(target, player, player); + let num = player.countMark("twmingce"); + if (target.hasSkillTag("filterDamage", null, { player: player })) { + num = 1; + } + return eff * num; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + num = player.countMark("twmingce"); + player.removeMark("twmingce", num); + await target.damage(num); + }, + }, + }, + }, //幻曹冲 twfushu: { audio: 2, @@ -3984,7 +4502,11 @@ const skills = { audio: 2, enable: "phaseUse", usable: 1, + trigger: { player: "useCardAfter" }, filter(event, player) { + if (event.name == "useCard" && event.card?.name != "shan") { + return false; + } return player.countCards("he", { type: "equip" }) && game.hasPlayer(current => player.canCompare(current, true)); }, filterTarget(card, player, target) { @@ -4001,9 +4523,47 @@ const skills = { } return Math.min(13, get.number(card) + 2) / Math.pow(Math.min(2, get.value(card)), 0.25); }, + async cost(event, trigger, player) { + event.result = await player + .chooseCardTarget({ + filterCard: { type: "equip" }, + position: "he", + filterTarget(card, player, target) { + return player.canCompare(target, true); + }, + prompt: get.prompt2(event.skill), + ai1(card) { + if (get.position(card) != "e") { + return 10; + } + return Math.min(13, get.number(card) + 2) / Math.pow(Math.min(2, get.value(card)), 0.25); + }, + ai2(target) { + const player = get.player(), + att = get.attitude(player, target); + const hs = player.getCards("he", { type: "equip" }).sort(function (a, b) { + return a.number - b.number; + }); + const ts = target.getCards("h").sort(function (a, b) { + return a.number - b.number; + }); + if (!hs.length || !ts.length) { + return 0; + } + if (hs[0].number <= ts[0].number) { + return -3 * att; + } + if (player.countCards("h") >= target.countCards("h")) { + return -10 * att; + } + return -1 * att; + }, + }) + .forResult(); + }, async content(event, trigger, player) { const card = event.cards[0], - target = event.target; + target = event.targets[0]; const { result } = await player.chooseToCompare(target).set("fixedResult", { [player.playerid]: card }); const cards = get.inpileVCardList(info => { if (info[0] != "trick") { @@ -4025,25 +4585,21 @@ const skills = { await player.useCard({ name: links[0][2] }, target, false); } } - const card1 = result.player, - card2 = result.target; - if (get.color(card1, player) == get.color(card2, target)) { - if (get.position(card1) == "d") { - await target.gain(card1, "gain2"); - } - if (get.position(card2) == "d") { - await player.gain(card2, "gain2"); - } + if (!result.bool) { + const card1 = result.player, + card2 = result.target; + await player.gain([card1, card2].filterInD("d"), "gain2"); + player.tempBanSkill(event.name); } }, ai: { order: 4, result: { target(player, target) { - var hs = player.getCards("he", { type: "equip" }).sort(function (a, b) { + const hs = player.getCards("he", { type: "equip" }).sort(function (a, b) { return a.number - b.number; }); - var ts = target.getCards("h").sort(function (a, b) { + const ts = target.getCards("h").sort(function (a, b) { return a.number - b.number; }); if (!hs.length || !ts.length) { @@ -4059,45 +4615,10 @@ const skills = { }, }, }, - group: "twqinghan_compare", - subSkill: { - compare: { - audio: "twqinghan", - trigger: { - player: "compare", - target: "compare", - }, - filter(event, player) { - if (!player.countCards("e")) { - return false; - } - if (event.player == player) { - return !event.iwhile; - } - return true; - }, - forced: true, - async content(event, trigger, player) { - const num = player.countCards("e") * 2; - if (player == trigger.player) { - trigger.num1 += num; - if (trigger.num1 > 13) { - trigger.num1 = 13; - } - } else { - trigger.num2 += num; - if (trigger.num2 > 13) { - trigger.num2 = 13; - } - } - game.log(player, "的拼点牌点数+", "#g", num); - }, - }, - }, }, twzhihuan: { audio: 2, - trigger: { + /*trigger: { source: "damageBegin2", }, filter(event, player) { @@ -4111,7 +4632,19 @@ const skills = { .some(i => player.hasEmptySlot(i))) ); }, - logTarget: "player", + logTarget: "player",*/ + trigger: { + global: "phaseEnd", + }, + filter(event, player) { + return ( + player + .getHistory("lose", evt => evt.cards2?.length) + .map(evt => evt.cards2.map(card => get.type2(card))) + .flat() + .unique().length > 1 + ); + }, async cost(event, trigger, player) { const target = trigger.player; const choices = []; @@ -4173,7 +4706,7 @@ const skills = { }; }, async content(event, trigger, player) { - trigger.cancel(); + //trigger.cancel(); if (event.cost_data == "选项一") { await player.gainPlayerCard(trigger.player, "e", true); } else { @@ -4189,7 +4722,7 @@ const skills = { } } } - trigger.player + /*trigger.player .when("useCard") .filter(evt => evt.card.name == "shan") .then(() => { @@ -4197,9 +4730,43 @@ const skills = { if (hs.length) { player.discard(hs.randomGets(2)); } - }); + });*/ } }, + group: "twzhihuan_compare", + subSkill: { + compare: { + trigger: { + player: "compare", + target: "compare", + }, + filter(event, player) { + if (!player.hasAllHistory("useCard", evt => get.type(evt.card) == "equip")) { + return false; + } + if (event.player == player) { + return !event.iwhile; + } + return true; + }, + forced: true, + async content(event, trigger, player) { + const num = player.getAllHistory("useCard", evt => get.type(evt.card) == "equip").length * 2; + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) { + trigger.num1 = 13; + } + } else { + trigger.num2 += num; + if (trigger.num2 > 13) { + trigger.num2 = 13; + } + } + game.log(player, "的拼点牌点数+", "#g", num); + }, + }, + }, }, //幻诸葛果 rexianyuan: { @@ -4466,7 +5033,7 @@ const skills = { }, forced: true, logTarget: "target", - content() { + async content(event, trigger, player) { const targets = [player, trigger.target]; for (const target of targets) { if (!target.countCards("h")) { @@ -4476,11 +5043,62 @@ const skills = { target.addGaintag(target.getCards("h").randomGets(2), "twkuiduan_card"); } }, + mod: { + ignoredHandcard(card, player) { + if (card.hasGaintag("twkuiduan_card")) { + return true; + } + }, + cardDiscardable(card, player, name) { + if (name == "phaseDiscard" && card.hasGaintag("twkuiduan_card")) { + return false; + } + }, + }, group: "twkuiduan_damage", subSkill: { + draw: { + charlotte: true, + audio: "twkuiduan", + forced: true, + trigger: { global: "damageSource" }, + filter(event, player) { + return event.card?.storage?.twkuiduan && event.source?.isIn(); + }, + logTarget: "source", + async content(event, trigger, player) { + const target = trigger.source; + if (target?.isIn()) { + const num = Math.min( + 5, + player.countCards("h", card => card.hasGaintag("twkuiduan_card") || get.name(card, player) == "sha") + ); + if (num > 0) { + await target.draw(num); + } + } + }, + }, damage: { audio: "twkuiduan", - trigger: { global: "damageBegin1" }, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.hasUseTarget(get.autoViewAs({ name: "juedou", isCard: true }), false, false); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget("溃端:视为对一名其他角色使用一张【决斗】", true, (card, player, target) => { + return player.canUse(get.autoViewAs({ name: "juedou", isCard: true }), target, false, false); + }) + .set("ai", target => get.effect(target, { name: "juedou" }, get.player(), get.player())) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + player.addTempSkill("twkuiduan_draw"); + await player.useCard(get.autoViewAs({ name: "juedou", isCard: true, storage: { twkuiduan: true } }), target, false); + }, + /*trigger: { global: "damageBegin1" }, filter(event, player) { if (!event.source) { return false; @@ -4508,7 +5126,7 @@ const skills = { logTarget: "source", content() { trigger.num++; - }, + },*/ }, card: { charlotte: true, @@ -7262,28 +7880,29 @@ const skills = { if (player.getStorage("twchengxi_used").includes(target) || target == player) { return false; } - return !player.hasSkillTag("noCompareSource") && target.countCards("h") > 0 && !target.hasSkillTag("noCompareTarget"); + return player.canCompare(target, true); }, - content() { - "step 0"; + async content(event, trigger, player) { + const { target } = event; if (!player.storage.twchengxi_used) { player.when("phaseUseAfter").then(() => delete player.storage.twchengxi_used); } player.markAuto("twchengxi_used", [target]); - player.draw(); - "step 1"; + await player.draw(); if (player.canCompare(target)) { - player.chooseToCompare(target); - } else { - event.finish(); - } - "step 2"; - if (result.bool) { - player.addSkill("twchengxi_effect"); - } else { - var card = { name: "sha", isCard: true }; - if (target.canUse(card, player, false)) { - target.useCard(card, player, false); + const { result } = await player.chooseToCompare(target); + if (!result) { + return; + } + if (result.bool) { + player.addSkill("twchengxi_effect"); + } else { + const card = { name: "sha", isCard: true }; + if (target.canUse(card, player, false)) { + await target.useCard(card, player, false); + } + player.addSkill("twchengxi_add"); + player.markAuto("twchengxi_add", [target]); } } }, @@ -7310,6 +7929,63 @@ const skills = { }, }, subSkill: { + add: { + popup: false, + charlotte: true, + onremove: true, + trigger: { player: "useCard2" }, + filter(event, player) { + if (!["basic", "trick"].includes(get.type(event.card))) { + return false; + } + if (!Array.isArray(event.targets)) { + return false; + } + return game.hasPlayer(target => { + if (!player.getStorage("twchengxi_add").includes(target)) { + return false; + } + return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target); + }); + }, + async cost(event, trigger, player) { + const targets = game.filterPlayer(target => { + if (!player.getStorage("twchengxi_add").includes(target)) { + return false; + } + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); + }); + if (targets.length == 1) { + const target = targets[0]; + const bool = await player.chooseBool(get.prompt(event.skill, target), "令" + get.translation(target) + "也成为" + get.translation(trigger.card) + "的目标").forResult("bool"); + 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); + }) + .set("ai", target => { + const player = get.player(), + trigger = get.event().getTrigger(); + return get.effect(target, trigger.card, player, player); + }) + .forResult(); + } + }, + async content(event, trigger, player) { + player.removeSkill(event.name); + player.line(event.targets); + trigger.targets.addArray(event.targets); + game.log(event.targets, "成为了", trigger.card, "的额外目标"); + }, + intro: { + content: "你使用的下一张基本牌和普通锦囊牌可以额外指定 $ 为目标", + }, + }, effect: { charlotte: true, trigger: { player: "useCard1" }, @@ -7318,9 +7994,10 @@ const skills = { }, forced: true, popup: false, - content() { - player.removeSkill("twchengxi_effect"); - player + async content(event, trigger, player) { + player.removeSkill(event.name); + trigger.effectCount++; + /*player .when("useCardAfter") .filter(evt => evt == trigger) .then(() => { @@ -7334,12 +8011,12 @@ const skills = { player.useCard(card, targets, false); } } - }); + });*/ }, mark: true, marktext: "袭", intro: { - content: "使用的下一张基本牌或非延时锦囊牌结算完毕后视为对相同目标再使用一张无次数限制的同名牌", + content: "使用的下一张基本牌或普通锦囊牌额外结算一次", }, }, }, @@ -8907,22 +9584,33 @@ const skills = { twxuechang: { audio: 2, enable: "phaseUse", - usable: 1, + usable: 2, filterTarget(card, player, target) { - return player.canCompare(target); + return player.canCompare(target, true); }, - content() { - "step 0"; - player.chooseToCompare(target); - "step 1"; - if (result.bool) { + async content(event, trigger, player) { + const { target } = event; + await player.draw(); + if (!player.canCompare(target)) { + return; + } + const { result } = await player.chooseToCompare(target); + if (result?.bool) { if (!target.countGainableCards(player, "he")) { - event.finish(); + return; } else { - player.gainPlayerCard(target, "he", true); + const result2 = await player.gainPlayerCard(target, "he", [1, 2], true).forResult(); + if (result2?.cards?.length) { + if (result2.cards.some(card => get.type(card) == "equip")) { + const card = { name: "sha", isCard: true }; + if (player.canUse(card, target, false, false)) { + await player.useCard(card, target, "noai", false); + } + } + } } } else { - player.damage(target); + await player.damage(target); player.addSkill("twxuechang_add"); if (!player.storage.twxuechang_add) { player.storage.twxuechang_add = {}; @@ -8932,15 +9620,6 @@ const skills = { } player.storage.twxuechang_add[target.playerid]++; player.markSkill("twxuechang_add"); - event.finish(); - } - "step 2"; - var card = result.cards[0]; - if (get.type(card) == "equip") { - var card = { name: "sha", isCard: true }; - if (player.canUse(card, target, false)) { - player.useCard(card, target, "noai", false); - } } }, ai: { @@ -8972,7 +9651,7 @@ const skills = { }, forced: true, charlotte: true, - content() { + async content(event, trigger, player) { trigger.num += player.storage.twxuechang_add[trigger.player.playerid]; delete player.storage.twxuechang_add[trigger.player.playerid]; if (get.is.empty(player.storage.twxuechang_add)) { @@ -9000,38 +9679,58 @@ const skills = { }, twduoren: { audio: 2, - trigger: { source: "dieAfter" }, + trigger: { global: "dieAfter" }, check(event, player) { - if (player.hp < 3 && !player.isDamaged()) { - return false; - } - var skills = event.player.getSkills(null, false, false).filter(skill => { + const skills = event.player.getStockSkills(true, true).filter(skill => { if (player.hasSkill(skill, null, false, false)) { return false; } - var info = get.info(skill); + const info = get.info(skill); return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; }); return skills.length > 0; }, - group: "twduoren_remove", + //group: "twduoren_remove", prompt2(event, player) { - var skills = event.player.getSkills(null, false, false).filter(skill => { - if (player.hasSkill(skill, null, false, false)) { + const skills = event.player.getStockSkills(true, true).filter(skill => { + /*if (player.hasSkill(skill, null, false, false)) { return false; - } - var info = get.info(skill); + }*/ + const info = get.info(skill); return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; }); - var str = ""; - for (var i of skills) { - str += "〖" + get.translation(i) + "〗、"; + let str1 = ""; + for (const i of skills) { + str1 += "〖" + get.translation(i) + "〗、"; + } + str1 = str1.slice(0, str1.length - 1); + let str2 = ""; + for (const i of player.getSkills(null, false, false).filter(skill => { + const info = get.info(skill); + return info && !info.charlotte && !player.getStockSkills(true, true).includes(skill); + })) { + str2 += "〖" + get.translation(i) + "〗、"; } - str = str.slice(0, str.length - 1); - return "减1点体力上限,然后" + (str.length ? "获得" + str : "听一句技能配音"); + str2 = str2.slice(0, str2.length - 1); + return `${str2.length ? `失去${str2},然后` : ""}${str1.length ? "获得" + str1 : "听一句技能配音"}`; + }, + filter(event, player) { + return event.player != player; }, logTarget: "player", - content() { + async content(event, trigger, player) { + await player.changeSkills( + trigger.player.getStockSkills(true, true).filter(skill => { + const info = get.info(skill); + return info && !info.hiddenSkill && !info.zhuSkill && !info.charlotte; + }), + player.getSkills(null, false, false).filter(skill => { + const info = get.info(skill); + return info && !info.charlotte && !player.getStockSkills(true, true).includes(skill); + }) + ); + }, + /*content() { "step 0"; player.loseMaxHp(); "step 1"; @@ -9080,7 +9779,7 @@ const skills = { delete player.storage.twduoren; }, }, - }, + },*/ }, //赵娥 twyanshi: { @@ -17992,7 +18691,13 @@ const skills = { check(card, player, target) { return 6 - get.value(card); }, - viewAs: { name: links[0][2], nature: links[0][3] }, + viewAs: { + name: links[0][2], + nature: links[0][3], + storage: { + twchaofeng: true, + }, + }, position: "hs", popname: true, }; @@ -18050,10 +18755,14 @@ const skills = { subSkill: { compare: { audio: "twchaofeng", - trigger: { player: "phaseUseBegin" }, + trigger: { player: "useCardAfter" }, + usable: 1, + filter(event, player) { + return event.card?.storage?.twchaofeng; + }, async cost(event, trigger, player) { event.result = await player - .chooseTarget(get.prompt("twchaofeng"), "选择至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】", [1, 3], (card, player, target) => { + .chooseTarget(get.prompt("twchaofeng"), "选择至多三名角色进行拼点,赢的角色视为对所有没赢的角色使用一张无距离和次数限制且不计入次数的火【杀】", [1, 3], (card, player, target) => { return player.canCompare(target); }) .set("ai", function (target) { @@ -18119,9 +18828,9 @@ const skills = { if (result.winner) { var targets = [player].addArray(event.targets).sortBySeat(player); targets.remove(result.winner); - var card = { name: "sha", nature: "fire", isCard: true }; - var targetsx = targets.filter(function (target) { - return result.winner.canUse(card, target, false); + const card = { name: "sha", nature: "fire", isCard: true }; + const targetsx = targets.filter(function (target) { + return result.winner.canUse(card, target, false, false); }); if (targetsx.length) { result.winner.useCard(card, targetsx, "noai").set("addCount", false); @@ -18133,8 +18842,10 @@ const skills = { }, twchuanshu: { audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - limited: true, + enable: "phaseUse", + usable: 1, + filterTarget: true, + /*limited: true, skillAnimation: true, animationColor: "qun", async cost(event, trigger, player) { @@ -18173,9 +18884,8 @@ const skills = { })() ) .forResult(); - }, + },*/ async content(event, trigger, player) { - player.awakenSkill(event.name); const target = event.targets[0]; target.addMark("twchuanshu_mark", 1, false); target.addSkill("twchuanshu_effect"); @@ -18183,6 +18893,18 @@ const skills = { player.addSkill("twchuanshu_clear"); player.markAuto("twchuanshu_clear", [target]); }, + ai: { + order: 7, + result: { + target(player, target) { + let val = 0; + if (target.hasSkill("twchaofeng")) { + val += ai.guessTargetPoints(target).max; + } + return val * get.threaten(target); + }, + }, + }, subSkill: { mark: { charlotte: true, @@ -18204,9 +18926,7 @@ const skills = { var str = "
  • 拼点牌点数+3;"; if (player.hasMark("twchuanshu_mark")) { str += "
  • 使用的下一张【杀】对除" + get.translation(shisyou) + "外的角色造成伤害时,此伤害+" + player.countMark("twchuanshu_mark") + ";"; - if (!shisyou.includes(player)) { - str += "
  • 使用的下一张【杀】结算结束后," + get.translation(shisyou) + "摸等同于伤害值的牌;"; - } + str += "
  • 使用的下一张【杀】造成伤害时," + get.translation(shisyou) + "摸等同于伤害值的牌;"; } str = str.slice(0, -1) + "。"; return str; @@ -18218,7 +18938,7 @@ const skills = { } return (player == event.player ? event.num1 : event.num2) < 13; }, - content() { + async content(event, trigger, player) { game.log(player, "的拼点牌点数+3"); if (player == trigger.player) { trigger.num1 = Math.min(13, trigger.num1 + 3); @@ -18230,7 +18950,7 @@ const skills = { }, damage: { charlotte: true, - trigger: { player: ["useCard", "useCardAfter"], source: "damageBegin1" }, + trigger: { player: ["useCard"], source: ["damageBegin1", "damageBegin4"] }, //, "useCardAfter" filter(event, player, name) { if (name == "useCard") { return event.card.name == "sha" && player.hasMark("twchuanshu_mark"); @@ -18239,6 +18959,12 @@ const skills = { return event.card && event.card.twchuanshu_mark && !player.getStorage("twchuanshu_effect").includes(event.player); } return ( + event.card.twchuanshu_mark && + player.getStorage("twchuanshu_effect").some(function (target) { + return target.isIn(); // && target != player + }) + ); + /*return ( event.card.twchuanshu_mark && player.hasHistory("sourceDamage", function (evt) { return evt.card == event.card; @@ -18246,35 +18972,35 @@ const skills = { player.getStorage("twchuanshu_effect").filter(function (target) { return target.isIn() && target != player; }).length - ); + );*/ }, forced: true, - content() { - var name = event.triggername; + async content(event, trigger, player) { + const name = event.triggername; if (name == "useCard") { - var num = player.countMark("twchuanshu_mark"); + const num = player.countMark("twchuanshu_mark"); trigger.card.twchuanshu_mark = num; player.removeMark("twchuanshu_mark", num, false); } else if (name == "damageBegin1") { trigger.num += trigger.card.twchuanshu_mark; } else { - var num1 = trigger.card.twchuanshu_mark; - var num2 = 0; + const num1 = trigger.card.twchuanshu_mark; + /*let num2 = 0; player.getHistory("sourceDamage", function (evt) { if (evt.card == trigger.card) { num2 += evt.num; } - }); - var targets = player.getStorage("twchuanshu_effect").filter(function (target) { - return target.isIn() && target != player; + });*/ + const targets = player.getStorage("twchuanshu_effect").filter(function (target) { + return target.isIn(); // && target != player }); if (!targets.length) { return; } if (targets.length == 1) { - targets[0].draw(num1 * num2); + await targets[0].draw(num1 * trigger.num); } else { - game.asyncDraw(targets, num1 * num2); + await game.asyncDraw(targets, num1 * trigger.num); } } }, @@ -18288,16 +19014,14 @@ const skills = { }, forced: true, silent: true, - content() { - "step 0"; - var targets = player.getStorage("twchuanshu_clear"); - for (var target of targets) { + async content(event, trigger, player) { + const targets = player.getStorage("twchuanshu_clear"); + for (const target of targets) { target.unmarkAuto("twchuanshu_effect", [player]); if (!target.getStorage("twchuanshu_effect").length) { target.removeSkill("twchuanshu_effect"); } } - "step 1"; player.removeSkill("twchuanshu_clear"); }, }, @@ -24012,6 +24736,7 @@ const skills = { target.insertPhase(); }, }, + //tw葛玄 gx_lingbaoxianhu: { trigger: { source: "damageSource", @@ -24155,7 +24880,7 @@ const skills = { }, }, }, - twdanfa: { + /*twdanfa: { audio: 2, trigger: { player: ["phaseZhunbeiBegin", "phaseJieshuBegin", "useCard"] }, filter(event, player) { @@ -24403,6 +25128,149 @@ const skills = { result: { player: 1 }, combo: "twdanfa", }, + },*/ + twdanfa: { + audio: 2, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) { + player.loseToDiscardpile(cards); + } + }, + check: () => true, + trigger: { player: ["useCardAfter", "respondAfter"] }, + filter(event, player) { + return event.cards?.some(card => get.owner(card) == player || !get.owner(card)) && !player.getExpansions("twdanfa").some(card => get.suit(card) == get.suit(event.card)); + }, + async content(event, trigger, player) { + await player + .addToExpansion( + trigger.cards.filter(card => get.owner(card) == player || !get.owner(card)), + "gain2" + ) + .set("gaintag", [event.name]); + await player.draw(); + }, + }, + twlingbao: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return ( + player + .getExpansions("twdanfa") + .map(card => get.suit(card)) + .unique().length > 1 + ); + }, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("灵宝", player.getExpansions("twdanfa")); + }, + check(button) { + const card = button.link; + }, + select: 2, + backup(links, player) { + return { + audio: "twlingbao", + filterCard(card) { + return lib.skill.twlingbao_backup.cards.includes(card); + }, + cards: links, + selectCard: -1, + position: "x", + async content(event, trigger, player) { + const cards = lib.skill.twlingbao_backup.cards, + colors = cards.map(card => get.color(card)).unique(); + if (colors.length == 1 && colors[0] == "red") { + const result = await player + .chooseTarget(`灵宝:令一名角色从牌堆中获得两张基本牌`, true) + .set("ai", target => get.effect(target, { name: "wuzhong" }, get.player(), get.player())) + .forResult(); + if (result?.targets?.length) { + const target = result.targets[0]; + player.line(target); + const gain = []; + while (gain.length < 2) { + const card = get.cardPile(cardx => get.type(cardx) == "basic" && !cards.includes(cardx)); + if (card) { + gain.push(card); + } else { + break; + } + } + if (gain.length) { + await target.gain(gain, "gain2"); + } + } + } + if (colors.length == 1 && colors[0] == "black") { + const result = await player + .chooseTarget(`灵宝:你弃置一名角色至多两个不同区域的共计至多两张牌`, true, (card, player, target) => { + return target.countDiscardableCards(player, "hej"); + }) + .set("ai", target => get.effect(target, { name: "guohe_copy" }, get.player(), get.player())) + .forResult(); + if (result?.targets?.length) { + const target = result.targets[0]; + player.line(target); + await player.discardPlayerCard(target, "hej", [1, 2], true); + } + } + if (colors.length > 1) { + const result = await player + .chooseTarget(`灵宝:你弃置一名角色至多两个不同区域的共计至多两张牌`, 2, true, (card, player, target) => { + if (!ui.selected.targets.length) { + return true; + } + return target.countDiscardableCards(player, "hej"); + }) + .set("ai", target => { + const player = get.player(); + if (!ui.selected.targets.length) { + return get.effect(target, { name: "wuzhong" }, player, player); + } + return get.effect(target, { name: "guohe_copy" }, player, player); + }) + .set("complexTarget", true) + .set("complexSelect", true) + .set("targetprompt", ["摸牌", "弃牌"]) + .forResult(); + if (result?.targets?.length) { + const draw = result.targets[0], + discard = result.targets[1]; + player.line(result.targets); + await draw.draw(2); + await discard.chooseToDiscard("he", true); + } + } + const suits = player + .getHistory("lose", evt => { + return evt.getParent().name == "discard" && evt.getParent(2).skill == "twlingbao_backup"; + }) + .map(evt => evt.cards.map(card => get.suit(card))) + .flat(); + if (suits.length != suits.unique().length) { + player.tempBanSkill("twlingbao"); + } + }, + }; + }, + }, + ai: { + order: 7, + result: { + player: 1, + }, + }, + subSkill: { + backup: {}, + }, }, twsidao: { audio: 2, @@ -24431,6 +25299,7 @@ const skills = { } }, async content(event, trigger, player) { + await player.draw(10); if (trigger.name == "phaseZhunbei") { await player.chooseUseTarget(player.storage.twsidao, "nopopup", true); } else { diff --git a/character/tw/sort.js b/character/tw/sort.js index 30c27a19e2..39369923c4 100644 --- a/character/tw/sort.js +++ b/character/tw/sort.js @@ -1,11 +1,11 @@ const characterSort = { - tw_sp: ["tw_simashi", "tw_beimihu", "tw_qiaozhou", "old_jiakui", "tw_jsp_guanyu", "tw_mazhong", "licuilianzhaoquanding", "simafu", "tw_zhugejun", "tw_yanliang", "tw_wenchou", "tw_yuantan", "tw_zhangzhao", "tw_zhanghong", "tw_fuwan", "tw_yujin", "tw_zhaoxiang", "tw_hucheer", "tw_hejin", "tw_mayunlu", "tw_re_caohong", "tw_zangba", "tw_liuhong", "tw_tianyu", "jiachong", "duosidawang", "wuban", "yuejiu", "tw_caocao", "tw_zhangmancheng", "tw_caozhao", "tw_wangchang", "tw_puyangxing", "tw_jiangji", "tw_niujin", "tw_xiahouen", "tw_xiahoushang", "tw_zhangji", "tw_zhangnan", "tw_fengxí", "tw_furong", "tw_liwei", "tw_yangyi", "tw_daxiaoqiao", "tw_dengzhi", "tw_baoxin", "tw_bingyuan", "tw_fanchou", "tw_haomeng", "tw_huchuquan", "tw_jianshuo", "tw_jiling", "tw_liufuren", "tw_mateng", "tw_niufudongxie", "tw_qiaorui", "tw_weixu", "tw_yanxiang", "tw_yufuluo", "tw_zhangning", "tw_dengzhi", "tw_yangyi", "tw_yangang", "tw_gongsunfan"], + tw_sp: ["tw_yanpu", "tw_simashi", "tw_beimihu", "tw_qiaozhou", "old_jiakui", "tw_jsp_guanyu", "tw_mazhong", "licuilianzhaoquanding", "simafu", "tw_zhugejun", "tw_yanliang", "tw_wenchou", "tw_yuantan", "tw_zhangzhao", "tw_zhanghong", "tw_fuwan", "tw_yujin", "tw_zhaoxiang", "tw_hucheer", "tw_hejin", "tw_mayunlu", "tw_re_caohong", "tw_zangba", "tw_liuhong", "tw_tianyu", "jiachong", "duosidawang", "wuban", "yuejiu", "tw_caocao", "tw_zhangmancheng", "tw_caozhao", "tw_wangchang", "tw_puyangxing", "tw_jiangji", "tw_niujin", "tw_xiahouen", "tw_xiahoushang", "tw_zhangji", "tw_zhangnan", "tw_fengxí", "tw_furong", "tw_liwei", "tw_yangyi", "tw_daxiaoqiao", "tw_dengzhi", "tw_baoxin", "tw_bingyuan", "tw_fanchou", "tw_haomeng", "tw_huchuquan", "tw_jianshuo", "tw_jiling", "tw_liufuren", "tw_mateng", "tw_niufudongxie", "tw_qiaorui", "tw_weixu", "tw_yanxiang", "tw_yufuluo", "tw_zhangning", "tw_dengzhi", "tw_yangyi", "tw_yangang", "tw_gongsunfan"], tw_yunchouzhi: ["tw_wangcan", "tw_dongzhao", "tw_bianfuren", "tw_feiyi", "tw_chenzhen", "tw_xunchen"], tw_yunchouxin: ["tw_wangling", "tw_huojun", "tw_wujing", "tw_zhouchu"], tw_yunchouren: ["tw_liuzhang", "tw_xujing", "tw_qiaogong"], tw_yunchouyong: ["tw_zongyu", "tw_chendong", "tw_sunyi"], tw_yunchouyan: ["tw_jiangqing"], - tw_sbcharacter: ["tw_sb_sp_zhugeliang", "tw_sb_caopi"], + tw_sbcharacter: ["tw_sb_chengong", "tw_sb_sp_zhugeliang", "tw_sb_caopi"], tw_swordsman: ["xia_yuzhenzi", "xia_shie", "xia_shitao", "xia_guanyu", "xia_liubei", "xia_xiahousone", "xia_xiahoudun", "xia_zhangwei", "xia_xushu", "xia_wangyue", "xia_liyàn", "xia_tongyuan", "xia_lusu", "xia_dianwei", "xia_zhaoe", "xia_xiahouzie"], tw_beiding: ["huan_luxun", "huan_liushan", "huan_zhugeliang", "huan_jiangwei", "huan_zhanghe", "huan_zhugeguo", "huan_weiyan", "huan_simayi", "huan_zhaoyun"], tw_weiang: ["huan_liufeng", "huan_caoang", "huan_huanggai", "huan_dingshangwan", "huan_dianwei", "huan_caopi", "huan_caozhi", "huan_caochong"], @@ -17,7 +17,7 @@ const characterSort = { tw_yijiang2: ["tw_chengpu", "tw_madai", "tw_handang"], tw_yijiang3: ["tw_fuhuanghou", "tw_guohuai"], tw_yijiang4: ["tw_sunluban", "tw_guyong"], - tw_yijiang5: ["tw_caoxiu", "old_quancong"], + tw_yijiang5: ["tw_zhuzhi", "tw_caoxiu", "old_quancong"], tw_yijiang7: ["tw_xuezong"], tw_yijiang: ["tw_caoang", "tw_caohong", "tw_zumao", "tw_dingfeng", "tw_maliang", "tw_xiahouba"], tw_english: ["kaisa"], diff --git a/character/tw/translate.js b/character/tw/translate.js index 623aa78018..8eae20f3a6 100644 --- a/character/tw/translate.js +++ b/character/tw/translate.js @@ -45,9 +45,9 @@ const translates = { tw_gexuan: "TW葛玄", tw_gexuan_prefix: "TW", twdanfa: "丹法", - twdanfa_info: "①准备阶段或结束阶段,你可将一张牌置于武将牌上,称为“丹”。②每回合每种花色限一次,当你使用牌时,若“丹”中有与此牌花色相同的牌,则你摸一张牌。", + twdanfa_info: "当你使用或打出的牌结算结束后,若此牌花色与你拥有的「丹」均不相同,你可以将此牌置于你的武将牌上,称为「丹」,然后摸一张牌。", twlingbao: "灵宝", - twlingbao_info: "出牌阶段限一次,你可以将两张花色不同的“丹”置入弃牌堆。若这两张牌:均为红色,你令一名角色回复1点体力;均为黑色,你弃置一名角色区域内至多两张区域不同牌;颜色不同,则你令一名角色摸一张牌,并令另一名角色弃置一张牌。", + twlingbao_info: "出牌阶段,你可以弃置两张花色不同的「丹」并摸两张牌,然后根据其情况执行如下效果:均为红色,你令一名角色从牌堆中获得两张基本牌;均为黑色,你弃置一名角色至多两个不同区域的共计至多两张牌;颜色不同,你令一名角色摸两张牌,另一名角色弃一张牌。然后若你于本回合弃置过两张相同花色的「丹」,则此技能失效直到回合结束。", twsidao: "司道", twsidao_info: "游戏开始时,你选择一张“法宝”置入装备区。准备阶段,若你以此法选择的法宝在牌堆/弃牌堆中,则你使用之。", gx_lingbaoxianhu: "灵宝仙壶", @@ -513,9 +513,9 @@ const translates = { xia_tongyuan_prefix: "侠", twchaofeng: "朝凤", twchaofeng_backup: "朝凤", - twchaofeng_info: "①你可以将一张【杀】当做【闪】、【闪】当做任意一种【杀】使用或打出。②出牌阶段开始时,你可以与至多三名角色共同拼点。赢的角色视为对所有没赢的角色使用一张火【杀】。", + twchaofeng_info: "①你可以将一张【杀】当做【闪】、【闪】当做任意一种【杀】使用或打出。②每回合限一次,当你以此法使用的牌结算结束后,你可以与至多三名角色进行拼点,赢的角色视为对所有没赢的角色使用一张无距离和次数限制且不计入次数的火【杀】。", twchuanshu: "传术", - twchuanshu_info: "限定技。准备阶段,你可以选择一名角色。直到你的下回合开始,其获得以下效果:1.当其拼点牌亮出时,此牌点数+3;2.其使用的下一张【杀】对除你外的角色造成伤害时,此伤害+1;3.若其不为你,其使用的下一张【杀】结算结束后,你摸等同于其因此【杀】造成的伤害值数的牌。", + twchuanshu_info: "出牌阶段限一次,你可以令一名角色直到你的下回合开始拼点点数+3,且其使用的下一张【杀】:对其他角色造成伤害+1;造成伤害时你摸X张牌(X为此杀造成伤害值)。", xia_xushu: "侠徐庶", xia_xushu_prefix: "侠", twjiange: "剑歌", @@ -569,9 +569,9 @@ const translates = { twrenchou_info: "锁定技。当你或“言誓”角色死亡时,若二者中的另一名角色A存活,A对杀死你或其的角色造成X点伤害(X为A的体力值)。", xia_xiahouzie: "夏侯紫萼", twxuechang: "血偿", - twxuechang_info: "出牌阶段限一次。你可以与一名其他角色拼点。若你:赢,你获得其一张牌,若此牌为装备牌,你视为对其使用一张【杀】;没赢,其对你造成1点伤害,且你下次对其造成的伤害+1。", + twxuechang_info: "出牌阶段限两次,你可以摸一张牌并与一名其他角色拼点。若你赢,你获得其至多两张牌,若其中有装备牌,则你视为对其使用一张无距离和次数限制且不计入次数的【杀】。若你没赢,你受到其造成的1点伤害,然后你下次对其造成的伤害+1", twduoren: "夺刃", - twduoren_info: "①当你杀死角色后,你可以减1点体力上限,然后获得其所有的非主公技和非隐匿技。②当你令其他角色进入濒死状态时,你失去因〖夺刃①〗获得的技能。", + twduoren_info: "一名其他角色死亡后,若你对其造成过伤害或其对你造成过伤害,则你可以获得其武将牌上所有技能(主公技、隐匿技除外),然后失去所有非自己武将牌上的技能。", tw_yangang: "严纲", twzhiqu: "直取", twzhiqu_info: "结束阶段,你可以选择一名其他角色并依次使用牌堆顶X张牌中的【杀】。搏击:依次使用牌堆顶X张牌中的锦囊牌(X为你距离不大于1内的角色数,且你或其以外的角色不是你以此法使用牌的合法目标)。", @@ -620,7 +620,7 @@ const translates = { twfenwang_info: "锁定技。①当你受到属性伤害时,你须弃置一张手牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于等于其,则此伤害+1。", xia_xiahousone: "夏侯子萼", twchengxi: "承袭", - twchengxi_info: "出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。", + twchengxi_info: "出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌额外结算一次;若你没赢,其视为对你使用一张无距离限制的普通【杀】,然后你使用的下一张基本牌或普通锦囊牌可额外指定其为目标。", xia_liubei: "侠刘备", xia_liubei_prefix: "侠", twshenyi: "伸义", @@ -713,7 +713,7 @@ const translates = { huan_zhanghe: "幻张郃", huan_zhanghe_prefix: "幻", twkuiduan: "溃端", - twkuiduan_info: "锁定技。①当你使用【杀】指定唯一目标后,你与其的随机两张手牌获得“溃端”标记,这些牌视为无属性【杀】。②一名角色使用含“溃端”标记的牌造成伤害时,若其含“溃端”标记的手牌数大于受伤角色含“溃端”标记的手牌数,则此伤害+1。", + twkuiduan_info: "锁定技。①当你使用【杀】指定唯一目标后,你与其的随机两张手牌获得“溃端”标记,这些牌视为普通【杀】。②你的“溃端”牌不计入手牌上限。③结束阶段,你视为对一名其他角色使用一张【决斗】,此牌造成伤害后,伤害来源摸X张牌(X为你手牌中【杀】和“溃端”牌的数量且至多为5)。", huan_zhugeguo: "幻诸葛果", huan_zhugeguo_prefix: "幻", twxianyuan: "仙援", @@ -725,9 +725,9 @@ const translates = { huan_jiangwei: "幻姜维", huan_jiangwei_prefix: "幻", twqinghan: "擎汉", - twqinghan_info: "①出牌阶段限一次,你可使用一张装备牌与一名其他角色拼点,若你赢,你可视为对其使用一张以其为唯一目标的普通锦囊牌;若两张拼点牌颜色相同,你与其获得对方的拼点牌。②你的拼点牌点数+X(X为你装备区牌数的两倍)。", + twqinghan_info: "出牌阶段限一次或你使用【闪】结算结束后,你可使用一张装备牌与一名其他角色拼点,若你赢,你可视为对其使用一张以其为唯一目标的普通锦囊牌;若你没赢,你获得所有拼点牌,然后此技能失效直到本轮结束。", twzhihuan: "治宦", - twzhihuan_info: "当你使用【杀】对目标角色造成伤害时,你可以防止此伤害并选择一项:1.获得其装备区里的一张牌;2.获得并使用一张牌堆或弃牌堆中你空置装备栏对应类别的装备牌,然后其下次使用【闪】时随机弃置两张手牌。", + twzhihuan_info: "①每个回合结束时,若你本回合失去过至少两种类型的牌,则你可以选择一项:1.获得当前回合角色装备区里的一张牌;2.获得并使用一张牌堆或弃牌堆中你空置装备栏对应类别的装备牌。②你的拼点牌点数+2X(X为你本局游戏使用过的装备牌数)。", huan_zhugeliang: "幻诸葛亮", huan_zhugeliang_prefix: "幻", twbeiding: "北定", @@ -870,6 +870,20 @@ const translates = { twmiewei_info: "出牌阶段开始时,你可令此阶段使用【杀】的次数等同于你攻击范围内的角色数。你使用【杀】对目标角色造成伤害时,此伤害+X(X为本回合被【杀】指定过的角色数-1且至多为5)。", twmiyong: "弥勇", twmiyong_info: "限定技,出牌阶段,你可展示并标记手牌中的两张【杀】。此【杀】每回合因首次使用、首次打出或首次弃置进入弃牌堆时,你展示并获得之。", + tw_sb_chengong: "TW谋陈宫", + tw_sb_chengong_prefix: "TW谋", + twmingce: "明策", + twmingce_info: "出牌阶段各限一次,你可以将一张牌交给一名其他角色,然后其选择一项:1. 其流失1点体力,你摸三张牌并获得一个「策」标记;2.其摸两张牌。(本阶段第二次执行选项时摸牌数-1)出牌阶段开始时,若你拥有「策」标记,你可以选择一名其他角色,对其造成X点伤害并移除所有「策」标记(X为你拥有的「策」标记数量)。", + tw_yanpu: "TW阎圃", + tw_yanpu_prefix: "TW", + twhuantu: "缓图", + twhuantu_info: "每轮限一次,一名其他角色摸牌阶段开始前,你可以交给其一张牌,令其跳过摸牌阶段,若如此做,其结束阶段你须选择一项:1. 令其回复1点体力并摸两张牌;2. 你摸三张牌并交给其两张手牌。若其本回合未造成伤害且其在你攻击范围内,你可以再对其执行另一项。", + twbihuo: "避祸", + twbihuo_info: "限定技,一名角色脱离濒死状态时,你可以令其摸X张牌,然后其他角色本轮计算与其的距离时+X(X为场上角色数,且至少为3)。", + tw_zhuzhi: "TW朱治", + tw_zhuzhi_prefix: "TW", + twanguo: "安国", + twanguo_info: "游戏开始时,你令一名其他角色获得「安国」标记。出牌阶段开始时,你可移动「安国」标记至另一名其他角色。出牌阶段限一次,你可以摸等同于拥有「安国」标记的角色已损失体力值张牌,并交给其等量的牌。当你或有「安国」标记的角色进入濒死状态时,你可永久移除「安国」标记中的一项效果,令濒死角色将体力回复至1点。你令有「安国」标记的角色获得以下效果:1.摸牌阶段额外摸一张牌;2.手牌上限等于其体力上限;3.其脱离濒死状态后,其摸一张牌。", }; export default translates; diff --git a/noname/library/element/content.js b/noname/library/element/content.js index d3372be050..429dabf9d5 100644 --- a/noname/library/element/content.js +++ b/noname/library/element/content.js @@ -6354,184 +6354,202 @@ player.removeVirtualEquip(card); "step 10"; event.cards.add(event.card1); }, - chooseToCompare: function () { - "step 0"; - if (((!event.fixedResult || !event.fixedResult[player.playerid]) && player.countCards("h") == 0) || ((!event.fixedResult || !event.fixedResult[target.playerid]) && target.countCards("h") == 0)) { - event.result = { cancelled: true, bool: false }; - event.finish(); - return; - } - game.log(player, "对", target, "发起", event.isDelay ? "延时" : "", "拼点"); - if (!event.filterCard) { - event.filterCard = lib.filter.all; - } - "step 1"; - event.list = [player, target].filter(function (current) { - return !event.fixedResult || !event.fixedResult[current.playerid]; - }); - if (event.list.length) { - player.chooseCardOL(event.list, "请选择拼点牌", true).set("small", event.small).set("filterCard", event.filterCard).set("type", "compare").set("ai", event.ai).set("source", player).aiCard = function (target) { - var hs = target.getCards("h"); - var event = _status.event; - event.player = target; - hs.sort(function (a, b) { - return event.ai(b) - event.ai(a); - }); - delete event.player; - return { bool: true, cards: [hs[0]] }; - }; - } - "step 2"; - const lose_list = []; - if (event.fixedResult && event.fixedResult[player.playerid]) { - lose_list.push([player, [event.fixedResult[player.playerid]]]); - } else { - if (result[0].skill && lib.skill[result[0].skill] && lib.skill[result[0].skill].onCompare) { - player.logSkill(result[0].skill); - result[0].cards = lib.skill[result[0].skill].onCompare(player); + chooseToCompare: [ + async (event, trigger, player) => { + const { target } = event; + if (((!event.fixedResult || !event.fixedResult[player.playerid]) && player.countCards("h") == 0) || ((!event.fixedResult || !event.fixedResult[target.playerid]) && target.countCards("h") == 0)) { + event.result = { cancelled: true, bool: false }; + event.finish(); + return; } - lose_list.push([player, result[0].cards]); - } - event.card1 = lose_list[0][1][0]; - if (event.list.includes(target)) { - let index = event.list.indexOf(target); - if (result[index].skill && lib.skill[result[index].skill] && lib.skill[result[index].skill].onCompare) { - target.logSkill(result[index].skill); - result[index].cards = lib.skill[result[index].skill].onCompare(target); + game.log(player, "对", target, "发起", event.isDelay ? "延时" : "", "拼点"); + if (!event.filterCard) { + event.filterCard = lib.filter.all; } - lose_list.push([target, result[index].cards]); - } else if (event.fixedResult && event.fixedResult[target.playerid]) { - lose_list.push([target, [event.fixedResult[target.playerid]]]); - } - event.card2 = lose_list[1][1][0]; - event.lose_list = lose_list; - "step 3"; - if (event.card2.number >= 10 || event.card2.number <= 4) { - if (target.countCards("h") > 2) { - event.addToAI = true; + }, + async (event, trigger, player) => { + const { target } = event; + event.list = [player, target].filter(function (current) { + return !event.fixedResult || !event.fixedResult[current.playerid]; + }); + if (event.list.length) { + player.chooseCardOL(event.list, "请选择拼点牌", true).set("small", event.small).set("filterCard", event.filterCard).set("type", "compare").set("ai", event.ai).set("source", player).aiCard = function (target) { + var hs = target.getCards("h"); + var event = _status.event; + event.player = target; + hs.sort(function (a, b) { + return event.ai(b) - event.ai(a); + }); + delete event.player; + return { bool: true, cards: [hs[0]] }; + }; } - } - "step 4"; - if (event.lose_list.length) { - game.loseAsync({ - lose_list: event.lose_list, - }).setContent("chooseToCompareLose"); - } - "step 5"; - if (event.isDelay) { - let cards = []; - for (let current of event.lose_list) { - current[0].$giveAuto(current[1], current[0], false); - cards.addArray(current[1]); + }, + async (event, trigger, player, result) => { + const { target } = event; + const lose_list = []; + if (event.fixedResult && event.fixedResult[player.playerid]) { + lose_list.push([player, [event.fixedResult[player.playerid]]]); + } else { + if (result[0].skill && lib.skill[result[0].skill] && lib.skill[result[0].skill].onCompare) { + player.logSkill(result[0].skill); + result[0].cards = lib.skill[result[0].skill].onCompare(player); + } + lose_list.push([player, result[0].cards]); } - game.cardsGotoSpecial(cards); - player - .when({ - global: ["dieAfter", "phaseEnd"], - }) - .assign({ - forceDie: true, - }) - .filter((event, player) => { - return event.name == "phase" || [player, target].includes(event.player); - }) - .vars({ - cardsx: cards, - evt: event, - }) - .then(() => { - if (cardsx?.some(card => get.position(card) == "s")) { - evt.isDestoryed = true; - game.cardsGotoOrdering(cardsx); - } else { - event.finish(); - } - }) - .then(() => { - game.cardsDiscard(cardsx); - }); - event.untrigger(); - event.finish(); - } else { - event.trigger("compareCardShowBefore"); - } - "step 6"; - game.broadcast(function () { - ui.arena.classList.add("thrownhighlight"); - }); - ui.arena.classList.add("thrownhighlight"); - game.addVideo("thrownhighlight1"); - player.$compare(event.card1, target, event.card2); - game.log(player, "的拼点牌为", event.card1); - game.log(target, "的拼点牌为", event.card2); - var getNum = function (card) { - for (var i of event.lose_list) { - if (i[1].includes(card)) { - return get.number(card, i[0]); + event.card1 = lose_list[0][1][0]; + if (event.list.includes(target)) { + let index = event.list.indexOf(target); + if (result[index].skill && lib.skill[result[index].skill] && lib.skill[result[index].skill].onCompare) { + target.logSkill(result[index].skill); + result[index].cards = lib.skill[result[index].skill].onCompare(target); } + lose_list.push([target, result[index].cards]); + } else if (event.fixedResult && event.fixedResult[target.playerid]) { + lose_list.push([target, [event.fixedResult[target.playerid]]]); } - return get.number(card, false); - }; - event.num1 = getNum(event.card1); - event.num2 = getNum(event.card2); - event.trigger("compare"); - game.delay(0, 1500); - "step 7"; - event.result = { - player: event.card1, - target: event.card2, - num1: event.num1, - num2: event.num2, - }; - event.trigger("compareFixing"); - "step 8"; - var str; - if (event.forceWinner === player || (event.forceWinner !== target && event.num1 > event.num2)) { - event.result.bool = true; - event.result.winner = player; - str = get.translation(player) + "拼点成功"; - player.popup("胜"); - target.popup("负"); - } else { - event.result.bool = false; - str = get.translation(player) + "拼点失败"; - if (event.forceWinner !== target && event.num1 == event.num2) { - event.result.tie = true; - player.popup("平"); - target.popup("平"); + event.card2 = lose_list[1][1][0]; + event.lose_list = lose_list; + }, + async (event, trigger, player) => { + const { target } = event; + if (event.card2.number >= 10 || event.card2.number <= 4) { + if (target.countCards("h") > 2) { + event.addToAI = true; + } + } + }, + async (event, trigger, player) => { + if (event.lose_list.length) { + game.loseAsync({ + lose_list: event.lose_list, + }).setContent("chooseToCompareLose"); + } + }, + async (event, trigger, player) => { + const { target } = event; + if (event.isDelay) { + let cards = []; + for (let current of event.lose_list) { + current[0].$giveAuto(current[1], current[0], false); + cards.addArray(current[1]); + } + game.cardsGotoSpecial(cards); + player + .when({ + global: ["dieAfter", "phaseEnd"], + }) + .assign({ + forceDie: true, + }) + .filter((event, player) => { + return event.name == "phase" || [player, target].includes(event.player); + }) + .vars({ + cardsx: cards, + evt: event, + }) + .then(() => { + if (cardsx?.some(card => get.position(card) == "s")) { + evt.isDestoryed = true; + game.cardsGotoOrdering(cardsx); + } else { + event.finish(); + } + }) + .then(() => { + game.cardsDiscard(cardsx); + }); + event.untrigger(); + event.finish(); } else { - event.result.winner = target; - player.popup("负"); - target.popup("胜"); + event.trigger("compareCardShowBefore"); } - } - game.broadcastAll(function (str) { - var dialog = ui.create.dialog(str); - dialog.classList.add("center"); - setTimeout(function () { - dialog.close(); - }, 1000); - }, str); - game.delay(2); - "step 9"; - if (typeof event.target.ai.shown == "number" && event.target.ai.shown <= 0.85 && event.addToAI) { - event.target.ai.shown += 0.1; - } - game.broadcastAll(function () { - ui.arena.classList.remove("thrownhighlight"); - }); - game.addVideo("thrownhighlight2"); - if (event.clear !== false) { - game.broadcastAll(ui.clear); - } - if (typeof event.preserve == "function") { - event.preserve = event.preserve(event.result); - } else if (event.preserve == "win") { - event.preserve = event.result.bool; - } else if (event.preserve == "lose") { - event.preserve = !event.result.bool; - } - }, + }, + async (event, trigger, player) => { + const { target } = event; + game.broadcast(function () { + ui.arena.classList.add("thrownhighlight"); + }); + ui.arena.classList.add("thrownhighlight"); + game.addVideo("thrownhighlight1"); + player.$compare(event.card1, target, event.card2); + game.log(player, "的拼点牌为", event.card1); + game.log(target, "的拼点牌为", event.card2); + var getNum = function (card) { + for (var i of event.lose_list) { + if (i[1].includes(card)) { + return get.number(card, i[0]); + } + } + return get.number(card, false); + }; + event.num1 = getNum(event.card1); + event.num2 = getNum(event.card2); + event.trigger("compare"); + game.delay(0, 1500); + }, + async (event, trigger, player) => { + event.result = { + player: event.card1, + target: event.card2, + num1: event.num1, + num2: event.num2, + }; + event.trigger("compareFixing"); + }, + async (event, trigger, player) => { + const { target } = event; + var str; + if (event.forceWinner === player || (event.forceWinner !== target && event.num1 > event.num2)) { + event.result.bool = true; + event.result.winner = player; + str = get.translation(player) + "拼点成功"; + player.popup("胜"); + target.popup("负"); + } else { + event.result.bool = false; + str = get.translation(player) + "拼点失败"; + if (event.forceWinner !== target && event.num1 == event.num2) { + event.result.tie = true; + player.popup("平"); + target.popup("平"); + } else { + event.result.winner = target; + player.popup("负"); + target.popup("胜"); + } + } + game.broadcastAll(function (str) { + var dialog = ui.create.dialog(str); + dialog.classList.add("center"); + setTimeout(function () { + dialog.close(); + }, 1000); + }, str); + game.delay(2); + }, + async (event, trigger, player) => { + //const {target} = event; + if (typeof event.target.ai.shown == "number" && event.target.ai.shown <= 0.85 && event.addToAI) { + event.target.ai.shown += 0.1; + } + game.broadcastAll(function () { + ui.arena.classList.remove("thrownhighlight"); + }); + game.addVideo("thrownhighlight2"); + if (event.clear !== false) { + game.broadcastAll(ui.clear); + } + if (typeof event.preserve == "function") { + event.preserve = event.preserve(event.result); + } else if (event.preserve == "win") { + event.preserve = event.result.bool; + } else if (event.preserve == "lose") { + event.preserve = !event.result.bool; + } + }, + ], async chooseToCompareEffect(event, trigger, player) { const evt = event.parentEvent; for (const key of ["target", "card1", "card2", "lose_list", "forceWinner", "clear", "preserve"]) { @@ -6619,8 +6637,8 @@ player.removeVirtualEquip(card); } else if (event.preserve == "lose") { event.preserve = !event.result.bool; } - await event.trigger("chooseToCompareAfter"); await event.trigger("chooseToCompareEnd"); + await event.trigger("chooseToCompareAfter"); }, chooseSkill: function () { "step 0"; @@ -11256,6 +11274,73 @@ player.removeVirtualEquip(card); source.classList.add("topcount"); } }, + //复活事件 + revive: async function (event, trigger, player) { + const { hp, log } = event; + if (log !== false) { + game.log(player, "复活"); + } + if (player.maxHp < 1) { + player.maxHp = 1; + } + player.hp = hp; + game.addVideo("revive", player); + player.classList.remove("dead"); + player.removeAttribute("style"); + player.node.avatar.style.transform = ""; + player.node.avatar2.style.transform = ""; + player.node.hp.show(); + player.node.equips.show(); + player.node.count.show(); + player.update(); + let playerx; + playerx = player.previousSeat; + while (playerx.isDead()) { + playerx = playerx.previousSeat; + } + playerx.next = player; + player.previous = playerx; + playerx = player.nextSeat; + while (playerx.isDead()) { + playerx = playerx.nextSeat; + } + playerx.previous = player; + player.next = playerx; + game.players.add(player); + game.dead.remove(player); + if (player == game.me) { + if (ui.auto) { + ui.auto.show(); + } + if (ui.wuxie) { + ui.wuxie.show(); + } + if (ui.revive) { + ui.revive.close(); + delete ui.revive; + } + if (ui.exit) { + ui.exit.close(); + delete ui.exit; + } + if (ui.swap) { + ui.swap.close(); + delete ui.swap; + } + if (ui.restart) { + ui.restart.close(); + delete ui.restart; + } + if (ui.continue_game) { + ui.continue_game.close(); + delete ui.continue_game; + } + if (player.node.dieidentity) { + player.node.dieidentity.delete(); + delete player.node.dieidentity; + } + } + }, //暂时还是只能一次加一张牌,需要后续跟进处理 //一次加一张够用了 addJudge: async function (event, trigger, player) { diff --git a/noname/library/element/player.js b/noname/library/element/player.js index d69900457f..8a314306e7 100644 --- a/noname/library/element/player.js +++ b/noname/library/element/player.js @@ -8054,73 +8054,17 @@ export class Player extends HTMLDivElement { * @param { boolean } [log] */ revive(hp, log) { - if (log !== false) { - game.log(this, "复活"); - } - if (this.maxHp < 1) { - this.maxHp = 1; - } + const next = game.createEvent("revive"); + next.player = this; if (hp) { - this.hp = hp; + next.hp = hp; } else { - this.hp = 1; - } - game.addVideo("revive", this); - this.classList.remove("dead"); - this.removeAttribute("style"); - this.node.avatar.style.transform = ""; - this.node.avatar2.style.transform = ""; - this.node.hp.show(); - this.node.equips.show(); - this.node.count.show(); - this.update(); - var player; - player = this.previousSeat; - while (player.isDead()) { - player = player.previousSeat; - } - player.next = this; - this.previous = player; - player = this.nextSeat; - while (player.isDead()) { - player = player.nextSeat; - } - player.previous = this; - this.next = player; - game.players.add(this); - game.dead.remove(this); - if (this == game.me) { - if (ui.auto) { - ui.auto.show(); - } - if (ui.wuxie) { - ui.wuxie.show(); - } - if (ui.revive) { - ui.revive.close(); - delete ui.revive; - } - if (ui.exit) { - ui.exit.close(); - delete ui.exit; - } - if (ui.swap) { - ui.swap.close(); - delete ui.swap; - } - if (ui.restart) { - ui.restart.close(); - delete ui.restart; - } - if (ui.continue_game) { - ui.continue_game.close(); - delete ui.continue_game; - } - if (this.node.dieidentity) { - this.node.dieidentity.delete(); - delete this.node.dieidentity; - } + next.hp = 1; } + next.log = log; + next.forceDie = true; + next.setContent("revive"); + return next; } isMad() { return this.hasSkill("mad");