更改描述:将“基本牌”改为“基本牌或普通锦囊牌”';
+ }
+ player
+ .chooseControl(list, function () {
+ if (!_status.event.player.hasSkill("jiaozhao")) return "draw_card";
+ return "更改描述";
+ })
+ .set("prompt", prompt);
+ }
+ "step 1";
+ if (result.control == "draw_card") {
+ player.draw();
+ } else {
+ game.log(player, "更改了", "【矫诏】", "的描述");
+ player.popup("更改描述");
+ player.addMark("xindanxin", 1, false);
+ }
+ },
+ ai: {
+ maixie: true,
+ effect: {
+ target: (card, player, target) => {
+ if (!get.tag(card, "damage")) return;
+ if (target.hp < 2 || player.hasSkillTag("jueqing", false, target)) return 1.5;
+ return [1, 1];
+ },
+ },
+ },
+ },
+ zongzuo: {
+ trigger: {
+ global: "phaseBefore",
+ player: "enterGame",
+ },
+ forced: true,
+ audio: 2,
+ filter: function (event, player) {
+ return event.name != "phase" || game.phaseNumber == 0;
+ },
+ content: function () {
+ "step 0";
+ var num = game.countGroup();
+ player.gainMaxHp(num);
+ event.num = num;
+ "step 1";
+ player.recover(event.num);
+ //player.update();
+ },
+ group: "zongzuo_lose",
+ subSkill: {
+ lose: {
+ trigger: { global: "dieAfter" },
+ forced: true,
+ audio: "zongzuo",
+ filter: function (event, player) {
+ if (!lib.group.includes(event.player.group)) return false;
+ if (
+ game.hasPlayer(function (current) {
+ return current.group == event.player.group;
+ })
+ ) {
+ return false;
+ }
+ return true;
+ },
+ content: function () {
+ player.loseMaxHp();
+ },
+ },
+ },
+ },
+ zhige: {
+ enable: "phaseUse",
+ usable: 1,
+ audio: 2,
+ filter: function (event, player) {
+ return player.countCards("h") > player.hp;
+ },
+ filterTarget: function (card, player, target) {
+ return get.distance(target, player, "attack") <= 1 && target.countCards("e") > 0;
+ },
+ content: function () {
+ "step 0";
+ target.chooseToUse({ name: "sha" }, "止戈:使用一张杀,或将其装备区里的一张牌交给" + get.translation(player));
+ "step 1";
+ if (!result.bool && target.countCards("e")) {
+ target.chooseCard("e", true, "将其装备区里的一张牌交给" + get.translation(player));
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool && result.cards && result.cards.length) {
+ target.give(result.cards, player);
+ }
+ },
+ ai: {
+ expose: 0.2,
+ order: 5,
+ result: {
+ target: -1,
+ player: function (player, target) {
+ if (target.countCards("h") == 0) return 0;
+ if (target.countCards("h") == 1) return -0.1;
+ if (player.hp <= 2) return -2;
+ if (player.countCards("h", "shan") == 0) return -1;
+ return -0.5;
+ },
+ },
+ },
+ },
+ kuangbi: {
+ enable: "phaseUse",
+ usable: 1,
+ audio: 2,
+ filterTarget: function (card, player, target) {
+ return target != player && target.countCards("he") > 0;
+ },
+ content: function () {
+ "step 0";
+ target.chooseCard("he", [1, 3], "匡弼:将至多三张牌置于" + get.translation(player) + "的武将牌上", true).set("ai", function (card) {
+ if (get.attitude(_status.event.player, _status.event.getParent().player) > 0) {
+ return 7 - get.value(card);
+ }
+ return -get.value(card);
+ });
+ "step 1";
+ if (result.bool) {
+ player.addToExpansion(result.cards, target, "give").gaintag.add("kuangbi");
+ if (!player.storage.kuangbi_draw) player.storage.kuangbi_draw = [[], []];
+ player.storage.kuangbi_draw[0].push(target);
+ player.storage.kuangbi_draw[1].push(result.cards.length);
+ player.addSkill("kuangbi_draw");
+ player.syncStorage("kuangbi_draw");
+ player.updateMarks("kuangbi_draw");
+ }
+ },
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ delete player.storage[skill];
+ },
+ ai: {
+ order: 1,
+ result: {
+ target: function (player, target) {
+ if (get.attitude(player, target) > 0) {
+ return Math.sqrt(target.countCards("he"));
+ }
+ return 0;
+ },
+ player: 1,
+ },
+ },
+ subSkill: {
+ draw: {
+ trigger: { player: "phaseZhunbeiBegin" },
+ forced: true,
+ mark: true,
+ charlotte: true,
+ audio: "kuangbi",
+ onremove: true,
+ filter: function (event, player) {
+ return player.getExpansions("kuangbi").length;
+ },
+ content: function () {
+ player.gain(player.getExpansions("kuangbi"), "gain2");
+ var storage = player.storage.kuangbi_draw;
+ if (storage.length) {
+ for (var i = 0; i < storage[0].length; i++) {
+ var target = storage[0][i],
+ num = storage[1][i];
+ if (target && target.isIn()) {
+ player.line(target);
+ target.draw(num);
+ }
+ }
+ }
+ player.removeSkill("kuangbi_draw");
+ },
+ },
+ },
+ },
+ fulin: {
+ trigger: { player: "phaseDiscardBegin" },
+ audio: 2,
+ forced: true,
+ content: function () {
+ player.addTempSkill("fulin2", "phaseDiscardAfter");
+ },
+ group: ["fulin_count", "fulin_reset"],
+ subSkill: {
+ reset: {
+ trigger: { player: ["phaseBefore", "phaseAfter"] },
+ silent: true,
+ priority: 10,
+ content: function () {
+ player.removeGaintag("fulin");
+ },
+ },
+ count: {
+ trigger: { player: "gainBegin" },
+ audio: "fulin",
+ forced: true,
+ silent: true,
+ filter: function (event, player) {
+ return _status.currentPhase == player;
+ },
+ content: function () {
+ trigger.gaintag.add("fulin");
+ },
+ },
+ },
+ onremove: function (player) {
+ player.removeGaintag("fulin");
+ },
+ },
+ fulin2: {
+ mod: {
+ ignoredHandcard: function (card, player) {
+ if (card.hasGaintag("fulin")) {
+ return true;
+ }
+ },
+ cardDiscardable: function (card, player, name) {
+ if (name == "phaseDiscard" && card.hasGaintag("fulin")) {
+ return false;
+ }
+ },
+ },
+ },
+ duliang: {
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: function (card, player, target) {
+ return player != target && target.countCards("h") > 0;
+ },
+ audio: 2,
+ content: function () {
+ "step 0";
+ player.gainPlayerCard(target, "h", true);
+ "step 1";
+ var name = get.translation(target);
+ player
+ .chooseControl(function () {
+ return Math.random() < 0.5 ? "选项一" : "选项二";
+ })
+ .set("prompt", "督粮")
+ .set("choiceList", ["令" + name + "观看牌堆顶的两张牌,然后获得其中的基本牌", "令" + name + "于下个摸牌阶段额外摸一张牌"]);
+ "step 2";
+ if (result.control == "选项一") {
+ var cards = get.cards(2);
+ target.viewCards("督粮", cards);
+ event.cards2 = [];
+ event.tothrow = [];
+ for (var i = 0; i < cards.length; i++) {
+ if (get.type(cards[i]) == "basic") {
+ ui.special.appendChild(cards[i]);
+ event.cards2.push(cards[i]);
+ } else {
+ event.tothrow.push(cards[i]);
+ }
+ }
+ while (event.tothrow.length) {
+ ui.cardPile.insertBefore(event.tothrow.pop(), ui.cardPile.firstChild);
+ }
+ } else {
+ target.addSkill("duliang2");
+ target.updateMarks("duliang2");
+ target.storage.duliang2++;
+ event.finish();
+ }
+ "step 3";
+ if (event.cards2 && event.cards2.length) {
+ target.gain(event.cards2, "draw");
+ game.log(target, "获得了" + get.cnNumber(event.cards2.length) + "张牌");
+ }
+ game.updateRoundNumber();
+ },
+ ai: {
+ order: 4,
+ result: {
+ target: -1,
+ player: 0.1,
+ },
+ },
+ },
+ duliang2: {
+ trigger: { player: "phaseDrawBegin" },
+ forced: true,
+ mark: true,
+ audio: false,
+ onremove: true,
+ charlotte: true,
+ init: function (player, skill) {
+ if (!player.storage[skill]) player.storage[skill] = 0;
+ },
+ intro: {
+ content: "下个摸牌阶段额外摸#张牌",
+ },
+ content: function () {
+ trigger.num += player.storage.duliang2;
+ player.removeSkill("duliang2");
+ },
+ },
+ xinfencheng: {
+ skillAnimation: "epic",
+ animationColor: "gray",
+ audio: 2,
+ audioname: ["re_liru"],
+ enable: "phaseUse",
+ filter: function (event, player) {
+ return !player.storage.xinfencheng;
+ },
+ filterTarget: function (card, player, target) {
+ return player != target;
+ },
+ unique: true,
+ limited: true,
+ selectTarget: -1,
+ multitarget: true,
+ multiline: true,
+ mark: true,
+ line: "fire",
+ content: function () {
+ "step 0";
+ player.storage.xinfencheng = true;
+ player.awakenSkill("xinfencheng");
+ event.num = 1;
+ event.targets = targets.slice(0);
+ event.targets.sort(lib.sort.seat);
+ "step 1";
+ if (event.targets.length) {
+ var target = event.targets.shift();
+ event.target = target;
+ var res = get.damageEffect(target, player, target, "fire");
+ target
+ .chooseToDiscard("he", "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害", [num, Infinity])
+ .set("ai", function (card) {
+ if (ui.selected.cards.length >= _status.event.getParent().num) return -1;
+ if (_status.event.player.hasSkillTag("nofire")) return -1;
+ if (_status.event.res >= 0) return 6 - get.value(card);
+ if (get.type(card) != "basic") {
+ return 10 - get.value(card);
+ }
+ return 8 - get.value(card);
+ })
+ .set("res", res);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (!result.bool) {
+ event.target.damage(2, "fire");
+ event.num = 1;
+ } else {
+ event.num = result.cards.length + 1;
+ }
+ event.goto(1);
+ },
+ ai: {
+ order: 1,
+ result: {
+ player: function (player) {
+ var num = 0,
+ eff = 0,
+ players = game
+ .filterPlayer(function (current) {
+ return current != player;
+ })
+ .sortBySeat(player);
+ for (var target of players) {
+ if (get.damageEffect(target, player, target, "fire") >= 0) {
+ num = 0;
+ continue;
+ }
+ var shao = false;
+ num++;
+ if (
+ target.countCards("he", function (card) {
+ if (get.type(card) != "basic") {
+ return get.value(card) < 10;
+ }
+ return get.value(card) < 8;
+ }) < num
+ )
+ shao = true;
+ if (shao) {
+ eff -= 4 * (get.realAttitude || get.attitude)(player, target);
+ num = 0;
+ } else eff -= (num * (get.realAttitude || get.attitude)(player, target)) / 4;
+ }
+ if (eff < 4) return 0;
+ return eff;
+ },
+ },
+ },
+ init: function (player) {
+ player.storage.xinfencheng = false;
+ },
+ intro: {
+ content: "limited",
+ },
+ },
+ xinjuece: {
+ audio: "juece",
+ audioname: ["dc_liru"],
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ filter: function (event, player) {
+ return game.hasPlayer(function (player) {
+ return player.countCards("h") == 0;
+ });
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("xinjuece"), "对一名没有手牌的角色造成1点伤害", function (card, player, target) {
+ return target.countCards("h") == 0;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.damageEffect(target, player, player);
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("xinjuece", result.targets);
+ result.targets[0].damage();
+ }
+ },
+ },
+ xinmieji: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filter: function (event, player) {
+ return player.countCards("h", { type: ["trick", "delay"], color: "black" });
+ },
+ filterCard: function (card) {
+ return get.color(card) == "black" && get.type(card, "trick") == "trick";
+ },
+ filterTarget: function (card, player, target) {
+ return target != player && target.countCards("h") > 0;
+ },
+ discard: false,
+ delay: false,
+ check: function (card) {
+ return 8 - get.value(card);
+ },
+ loseTo: "cardPile",
+ insert: true,
+ visible: true,
+ content: function () {
+ "step 0";
+ player.showCards(cards);
+ "step 1";
+ target.chooseToDiscard("he", true).set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。");
+ "step 2";
+ if (
+ (!result.cards || get.type(result.cards[0], "trick", result.cards[0].original == "h" ? target : false) != "trick") &&
+ target.countCards("he", function (card) {
+ return get.type(card, "trick") != "trick";
+ })
+ ) {
+ target
+ .chooseToDiscard("he", true, function (card) {
+ return get.type(card, "trick") != "trick";
+ })
+ .set("prompt", "请弃置第二张非锦囊牌");
+ }
+ },
+ ai: {
+ order: 9,
+ result: {
+ target: -1,
+ },
+ },
+ },
+ qianju: {
+ mod: {
+ globalFrom: function (from, to, distance) {
+ return distance - from.getDamagedHp();
+ },
+ },
+ },
+ reqianju: {
+ mod: {
+ globalFrom: function (from, to, distance) {
+ return distance - Math.max(1, from.getDamagedHp());
+ },
+ },
+ },
+ reqingxi: {
+ audio: 2,
+ trigger: { player: "useCardToPlayered" },
+ filter: function (event, player) {
+ return event.card.name == "sha" || event.card.name == "juedou";
+ },
+ check: function (event, player) {
+ return get.attitude(player, event.target) < 0;
+ },
+ logTarget: "target",
+ content: function () {
+ "step 0";
+ var num = Math.min(
+ game.countPlayer(function (current) {
+ return player.inRange(current);
+ }),
+ player.getEquips(1).length ? 4 : 2
+ );
+ if (trigger.target.countCards("h") < num) {
+ event.directfalse = true;
+ } else {
+ trigger.target.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令" + get.translation(trigger.card) + "的伤害+1").set("ai", function (card) {
+ var player = _status.event.player;
+ if (player.hp == 1) {
+ if (get.type(card) == "basic") {
+ return 8 - get.value(card);
+ } else {
+ return 10 - get.value(card);
+ }
+ } else {
+ if (num > 2) {
+ return 0;
+ }
+ return 8 - get.value(card);
+ }
+ });
+ }
+ "step 1";
+ if (!event.directfalse && result.bool) {
+ var e1 = player.getEquips(1);
+ if (e1.length) {
+ player.discard(e1, "notBySelf");
+ }
+ event.finish();
+ } else {
+ var id = trigger.target.playerid;
+ var map = trigger.customArgs;
+ if (!map[id]) map[id] = {};
+ if (!map[id].extraDamage) map[id].extraDamage = 0;
+ map[id].extraDamage++;
+ player.judge(function (card) {
+ if (get.color(card) == "red") return 1;
+ return 0;
+ }).judge2 = function (result) {
+ return result.bool;
+ };
+ }
+ "step 2";
+ if (result.color == "red") trigger.directHit.add(trigger.target);
+ },
+ },
+ reqingxi2: {
+ mod: {
+ cardEnabled: function (card, player) {
+ if (
+ player.storage.reqingxi2 &&
+ player.storage.reqingxi2.filter(function (cd) {
+ return get.color(cd) == get.color(card);
+ }).length
+ )
+ return false;
+ },
+ cardRespondable: function (card, player) {
+ if (
+ player.storage.reqingxi2 &&
+ player.storage.reqingxi2.filter(function (cd) {
+ return get.color(cd) == get.color(card);
+ }).length
+ )
+ return false;
+ },
+ },
+ firstDo: true,
+ onremove: true,
+ trigger: {
+ player: ["damage", "damageCancelled", "damageZero"],
+ target: ["shaMiss", "useCardToExcluded"],
+ },
+ charlotte: true,
+ filter: function (event, player) {
+ return player.storage.reqingxi2 && event.card && player.storage.reqingxi2.includes(event.card);
+ },
+ silent: true,
+ forced: true,
+ popup: false,
+ priority: 12,
+ content: function () {
+ player.storage.reqingxi2.remove(trigger.card);
+ if (!player.storage.reqingxi2.length) player.removeSkill("reqingxi2");
+ },
+ },
+ qingxi: {
+ audio: 2,
+ trigger: { source: "damageBegin1" },
+ check: function (event, player) {
+ return get.attitude(player, event.player) < 0;
+ },
+ filter: function (event, player) {
+ return event.getParent().name == "sha" && player.getEquips(1).length > 0;
+ },
+ content: function () {
+ "step 0";
+ var num = player.getEquipRange();
+ if (trigger.player.countCards("h") < num) {
+ event.directfalse = true;
+ } else {
+ trigger.player.chooseToDiscard(num, "弃置" + get.cnNumber(num) + "张手牌,或令杀的伤害+1").set("ai", function (card) {
+ var player = _status.event.player;
+ if (player.hp == 1) {
+ if (get.type(card) == "basic") {
+ return 8 - get.value(card);
+ } else {
+ return 10 - get.value(card);
+ }
+ } else {
+ if (num > 2) {
+ return 0;
+ }
+ return 8 - get.value(card);
+ }
+ });
+ }
+ "step 1";
+ if (!event.directfalse && result.bool) {
+ var e1 = player.getEquips(1);
+ if (e1.length) {
+ player.discard(e1, "notBySelf");
+ }
+ } else {
+ trigger.num++;
+ }
+ },
+ },
+ jieyue: {
+ audio: 2,
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ content: function () {
+ "step 0";
+ player.chooseCardTarget({
+ filterTarget: function (card, player, target) {
+ return target != player && target.countCards("he") > 0;
+ },
+ filterCard: lib.filter.cardDiscardable,
+ ai1: function (card) {
+ return 7 - get.useful(card);
+ },
+ ai2: function (target) {
+ return 1 - get.attitude(_status.event.player, target);
+ },
+ prompt: get.prompt2("jieyue"),
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("jieyue", result.targets);
+ player.discard(result.cards);
+ var target = result.targets[0];
+ event.target = target;
+ target.chooseCard("将一张牌置于" + get.translation(player) + "的武将牌上,或令其弃置你的一张牌", "he").set("ai", function (card) {
+ if (card.name == "du") return 20;
+ var player = _status.event.player;
+ if (get.attitude(player, _status.event.getParent().player) > 0) {
+ return 8 - get.value(card);
+ }
+ var nh = player.countCards("h");
+ if (nh <= 2) {
+ return 6 - get.value(card);
+ }
+ if (nh <= 3) {
+ return 2 - get.value(card);
+ }
+ return 0;
+ });
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool && result.cards && result.cards.length) {
+ player.addToExpansion(result.cards, "give", target).gaintag.add("jieyue");
+ } else if (event.target.countCards("he")) {
+ player.discardPlayerCard(event.target, true);
+ }
+ },
+ ai: { expose: 0.1 },
+ marktext: "节",
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ group: ["jieyue_wuxie", "jieyue_shan", "jieyue_gain"],
+ subSkill: {
+ wuxie: {
+ audio: true,
+ enable: "chooseToUse",
+ filterCard: function (card) {
+ return get.color(card) == "black";
+ },
+ viewAsFilter: function (player) {
+ return player.getExpansions("jieyue").length && player.countCards("hs", { color: "black" }) > 0;
+ },
+ position: "hs",
+ viewAs: { name: "wuxie" },
+ prompt: "将一张黑色手牌当无懈可击使用",
+ check: function (card) {
+ return 8 - get.value(card);
+ },
+ },
+ shan: {
+ audio: true,
+ enable: ["chooseToRespond", "chooseToUse"],
+ filterCard: function (card) {
+ return get.color(card) == "red";
+ },
+ position: "hs",
+ viewAs: { name: "shan" },
+ viewAsFilter: function (player) {
+ return player.getExpansions("jieyue").length && player.countCards("hs", { color: "red" }) > 0;
+ },
+ prompt: "将一张红色手牌当闪使用或打出",
+ check: () => 1,
+ ai: {
+ respondShan: true,
+ skillTagFilter: function (player) {
+ if (!player.getExpansions("jieyue").length || !player.countCards("hs", { color: "red" })) return false;
+ },
+ effect: {
+ target: function (card, player, target, current) {
+ if (get.tag(card, "respondShan") && current < 0) return 0.8;
+ },
+ },
+ },
+ },
+ gain: {
+ audio: "jieyue",
+ trigger: { player: "phaseZhunbeiBegin" },
+ filter: function (event, player) {
+ return player.getExpansions("jieyue").length;
+ },
+ forced: true,
+ content: function () {
+ var cards = player.getExpansions("jieyue");
+ if (cards.length) player.gain(cards, "gain2");
+ },
+ },
+ },
+ },
+ jinjiu: {
+ mod: {
+ cardname: function (card, player) {
+ if (card.name == "jiu") return "sha";
+ },
+ },
+ ai: {
+ skillTagFilter: function (player) {
+ if (!player.countCards("h", "jiu")) return false;
+ },
+ respondSha: true,
+ },
+ audio: 2,
+ trigger: { player: ["useCard1", "respond"] },
+ firstDo: true,
+ forced: true,
+ filter: function (event, player) {
+ return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "jiu";
+ },
+ content: function () {},
+ },
+ xinxianzhen: {
+ audio: "xianzhen",
+ inherit: "xianzhen",
+ },
+ xinxianzhen2: {
+ audio: "xianzhen",
+ audioname2: {
+ ol_gaoshun: "rexianzhen",
+ },
+ mod: {
+ targetInRange: function (card, player, target) {
+ if (target == player.storage.xinxianzhen) return true;
+ },
+ cardUsableTarget: function (card, player, target) {
+ if (target == player.storage.xinxianzhen) return true;
+ },
+ },
+ ai: {
+ unequip: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (arg.target != player.storage.xinxianzhen) return false;
+ },
+ effect: {
+ player: function (card, player, target, current, isLink) {
+ if (isLink || !player.storage.xinxianzhen) return;
+ if (target != player.storage.xinxianzhen && ["sha", "guohe", "shunshou", "huogong", "juedou"].includes(card.name)) {
+ if (get.effect(player.storage.xinxianzhen, card, player, player) > 0) {
+ return [1, 2];
+ }
+ }
+ },
+ },
+ },
+ trigger: { player: "useCard2" },
+ filter: function (event, player) {
+ return player.storage.xinxianzhen && player.storage.xinxianzhen.isIn() && (event.card.name == "sha" || get.type(event.card) == "trick") && event.targets && event.targets.length == 1 && !event.targets.includes(player.storage.xinxianzhen);
+ },
+ check: function (event, player) {
+ return get.effect(player.storage.xinxianzhen, event.card, player, player) > 0;
+ },
+ logTarget: function (event, player) {
+ return player.storage.xinxianzhen;
+ },
+ prompt2: (event, player) => "令" + get.translation(player.storage.decadexianzhen2) + "也成为" + get.translation(event.card) + "的目标",
+ content: function () {
+ var target = player.storage.xinxianzhen;
+ trigger.targets.push(target);
+ game.log(target, "成为了", trigger.card, "的额外目标");
+ },
+ },
+ xinxianzhen3: {
+ charlotte: true,
+ mod: {
+ cardEnabled: function (card) {
+ if (card.name == "sha") return false;
+ },
+ ignoredHandcard: function (card, player) {
+ if (get.name(card) == "sha") {
+ return true;
+ }
+ },
+ cardDiscardable: function (card, player, name) {
+ if (name == "phaseDiscard" && get.name(card) == "sha") {
+ return false;
+ }
+ },
+ },
+ },
+ xianzhen: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: function (card, player, target) {
+ return player.canCompare(target);
+ },
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ content: function () {
+ "step 0";
+ player.chooseToCompare(target);
+ "step 1";
+ if (result.bool) {
+ player.storage[event.name] = target;
+ player.addTempSkill(event.name + 2);
+ } else {
+ player.addTempSkill(event.name + 3);
+ }
+ },
+ ai: {
+ order: function (name, player) {
+ var cards = player.getCards("h");
+ if (player.countCards("h", "sha") == 0) {
+ return 1;
+ }
+ for (var i = 0; i < cards.length; i++) {
+ if (cards[i].name != "sha" && get.number(cards[i]) > 11 && get.value(cards[i]) < 7) {
+ return 9;
+ }
+ }
+ return get.order({ name: "sha" }) - 1;
+ },
+ result: {
+ player: function (player) {
+ if (player.countCards("h", "sha") > 0) return 0;
+ var num = player.countCards("h");
+ if (num > player.hp) return 0;
+ if (num == 1) return -2;
+ if (num == 2) return -1;
+ return -0.7;
+ },
+ target: function (player, target) {
+ var num = target.countCards("h");
+ if (num == 1) return -1;
+ if (num == 2) return -0.7;
+ return -0.5;
+ },
+ },
+ threaten: 1.3,
+ },
+ },
+ xianzhen2: {
+ charlotte: true,
+ mod: {
+ targetInRange: function (card, player, target) {
+ if (target == player.storage.xianzhen) return true;
+ },
+ cardUsableTarget: function (card, player, target) {
+ if (target == player.storage.xianzhen) return true;
+ },
+ },
+ ai: {
+ unequip: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (arg.target != player.storage.xianzhen) return false;
+ },
+ },
+ },
+ xianzhen3: {
+ charlotte: true,
+ mod: {
+ cardEnabled: function (card) {
+ if (card.name == "sha") return false;
+ },
+ },
+ },
+ lihuo: {
+ trigger: { player: "useCard1" },
+ filter: function (event, player) {
+ if (event.card.name == "sha" && !game.hasNature(event.card)) return true;
+ return false;
+ },
+ audio: 2,
+ audioname: ["re_chengpu"],
+ check: function (event, player) {
+ return false;
+ },
+ content: function () {
+ game.setNature(trigger.card, "fire");
+ var next = game.createEvent("lihuo_clear");
+ next.player = player;
+ next.card = trigger.card;
+ event.next.remove(next);
+ next.forceDie = true;
+ trigger.after.push(next);
+ next.setContent(function () {
+ if (
+ player.isIn() &&
+ player.getHistory("sourceDamage", function (evt) {
+ return evt.getParent(2) == event.parent;
+ }).length > 0
+ )
+ player.loseHp();
+ game.setNature(card, [], true);
+ });
+ },
+ group: "lihuo2",
+ },
+ lihuo2: {
+ trigger: { player: "useCard2" },
+ filter: function (event, player) {
+ if (event.card.name != "sha" || !game.hasNature(event.card, "fire")) return false;
+ return game.hasPlayer(function (current) {
+ return !event.targets.includes(current) && player.canUse(event.card, current);
+ });
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("lihuo"), "为" + get.translation(trigger.card) + "增加一个目标", function (card, player, target) {
+ return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target);
+ })
+ .set("sourcex", trigger.targets)
+ .set("card", trigger.card)
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.effect(target, _status.event.card, player, player);
+ });
+ "step 1";
+ if (result.bool) {
+ if (!event.isMine() && !_status.connectMode) game.delayx();
+ event.target = result.targets[0];
+ } else {
+ event.finish();
+ }
+ "step 2";
+ player.logSkill("lihuo", event.target);
+ trigger.targets.push(event.target);
+ },
+ },
+ lihuo3: {
+ trigger: { player: "useCardAfter" },
+ vanish: true,
+ filter: function (event, player) {
+ return event.card.name == "sha";
+ },
+ forced: true,
+ audio: false,
+ content: function () {
+ player.loseHp();
+ player.removeSkill("lihuo3");
+ },
+ },
+ chunlao: {
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ audio: 2,
+ audioname: ["xin_chengpu"],
+ filter: function (event, player) {
+ return player.countCards("h") > 0 && (_status.connectMode || player.countCards("h", "sha") > 0) && !player.getExpansions("chunlao").length;
+ },
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseCard([1, Math.max(1, player.countCards("h", "sha"))], get.prompt("chunlao"), {
+ name: "sha",
+ })
+ .set("ai", function () {
+ return 1;
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("chunlao");
+ player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("chunlao");
+ }
+ },
+ ai: {
+ effect: {
+ player: function (card, player, target) {
+ if (_status.currentPhase != player) return;
+ if (card.name == "sha" && !player.needsToDiscard() && !player.getExpansions("chunlao").length && target.hp > 1) {
+ return "zeroplayertarget";
+ }
+ },
+ },
+ threaten: 1.4,
+ },
+ group: "chunlao2",
+ },
+ chunlao2: {
+ enable: "chooseToUse",
+ filter: function (event, player) {
+ return event.type == "dying" && event.dying && event.dying.hp <= 0 && player.getExpansions("chunlao").length > 0;
+ },
+ filterTarget: function (card, player, target) {
+ return target == _status.event.dying;
+ },
+ direct: true,
+ clearTime: true,
+ delay: false,
+ selectTarget: -1,
+ content: function () {
+ "step 0";
+ player.chooseCardButton(get.translation("chunlao"), player.getExpansions("chunlao"), true);
+ "step 1";
+ if (result.bool) {
+ player.logSkill("chunlao", target);
+ player.loseToDiscardpile(result.links);
+ event.type = "dying";
+ target.useCard({ name: "jiu", isCard: true }, target);
+ }
+ },
+ ai: {
+ order: 6,
+ skillTagFilter: function (player) {
+ return player.getExpansions("chunlao").length > 0;
+ },
+ save: true,
+ result: {
+ target: 3,
+ },
+ threaten: 1.6,
+ },
+ },
+ chunlao2_old: {
+ trigger: { global: "dying" },
+ //priority:6,
+ filter: function (event, player) {
+ return event.player.hp <= 0 && player.storage.chunlao.length > 0;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var att = get.attitude(player, trigger.player);
+ player
+ .chooseCardButton(get.prompt("chunlao", trigger.player), player.storage.chunlao)
+ .set("ai", function (button) {
+ if (_status.event.att > 0) return 1;
+ return 0;
+ })
+ .set("att", att);
+ "step 1";
+ if (result.bool) {
+ player.logSkill("chunlao", trigger.player);
+ player.$throw(result.links);
+ player.storage.chunlao.remove(result.links[0]);
+ result.links[0].discard();
+ player.syncStorage("chunlao");
+ trigger.player.useCard({ name: "jiu", isCard: true }, trigger.player);
+ if (!player.storage.chunlao.length) {
+ player.unmarkSkill("chunlao");
+ } else {
+ player.markSkill("chunlao");
+ }
+ }
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ shenduan: {
+ trigger: {
+ player: "loseAfter",
+ global: "loseAsyncAfter",
+ },
+ filter: function (event, player) {
+ if (event.type != "discard" || event.getlx === false) return;
+ var evt = event.getl(player);
+ for (var i = 0; i < evt.cards2.length; i++) {
+ if (get.color(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "black" && get.type(evt.cards2[i]) == "basic" && get.position(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "d") {
+ return true;
+ }
+ }
+ return false;
+ },
+ audio: 2,
+ direct: true,
+ content: function () {
+ "step 0";
+ var cards = [];
+ var evt = trigger.getl(player);
+ for (var i = 0; i < evt.cards2.length; i++) {
+ if (get.color(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "black" && get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false) == "basic" && get.position(evt.cards2[i]) == "d") {
+ cards.push(evt.cards2[i]);
+ }
+ }
+ if (!cards.length) {
+ event.finish();
+ } else {
+ event.cards = cards;
+ }
+ "step 1";
+ if (event.cards.length) {
+ player
+ .chooseTarget(get.prompt("shenduan"), "将" + get.translation(event.cards) + (event.cards.length > 1 ? "中的一张牌" : "") + "当做【兵粮寸断】对一名其他角色使用", function (card, player, target) {
+ var cs = _status.event.cards;
+ for (var i = 0; i < cs.length; i++) {
+ if (player.canUse({ name: "bingliang", cards: [cs[i]] }, target, false)) return true;
+ }
+ return false;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.effect(target, { name: "bingliang" }, player, player);
+ })
+ .set("cards", cards);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool && result.targets && result.targets.length) {
+ event.current = result.targets[0];
+ if (event.cards.length == 1) {
+ event.directCard = event.cards[0];
+ } else {
+ delete event.directCard;
+ player
+ .chooseCardButton("选择一张牌当作兵断寸断使用", event.cards, true)
+ .set("filterButton", function (button) {
+ return player.canUse({ name: "bingliang", cards: [button.link] }, _status.event.target, false);
+ })
+ .set("target", event.current);
+ }
+ } else {
+ event.finish();
+ }
+ "step 3";
+ var card;
+ if (event.directCard) {
+ card = event.directCard;
+ } else if (result.links && result.links.length && event.cards.includes(result.links[0])) {
+ card = result.links[0];
+ }
+ if (card) {
+ event.cards.remove(card);
+ player.line(event.current);
+ player.useCard({ name: "bingliang" }, event.current, [card], "shenduan").animate = false;
+ event.goto(1);
+ }
+ },
+ },
+ reshenduan: {
+ audio: 2,
+ trigger: {
+ global: "loseAsyncAfter",
+ player: "loseAfter",
+ },
+ filter: function (event, player) {
+ if (event.type != "discard" || event.getlx === false) return;
+ var evt = event.getl(player);
+ for (var i = 0; i < evt.cards2.length; i++) {
+ if (get.color(evt.cards2[i], player) == "black" && ["basic", "equip"].includes(get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false)) && get.position(evt.cards2[i]) == "d") {
+ return true;
+ }
+ }
+ return false;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var cards = [];
+ var evt = trigger.getl(player);
+ for (var i = 0; i < evt.cards2.length; i++) {
+ if (get.color(evt.cards2[i], player) == "black" && ["basic", "equip"].includes(get.type(evt.cards2[i], evt.hs.includes(evt.cards2[i]) ? evt.player : false)) && get.position(evt.cards2[i]) == "d") {
+ cards.push(evt.cards2[i]);
+ }
+ }
+ if (!cards.length) {
+ event.finish();
+ } else {
+ event.cards = cards;
+ }
+ "step 1";
+ if (event.cards.length) {
+ player
+ .chooseTarget(get.prompt("shenduan"), "将" + get.translation(event.cards) + (event.cards.length > 1 ? "中的一张牌" : "") + "当做【兵粮寸断】对一名其他角色使用", function (card, player, target) {
+ var cs = _status.event.cards;
+ for (var i = 0; i < cs.length; i++) {
+ if (player.canUse({ name: "bingliang", cards: [cs[i]] }, target, false)) return true;
+ }
+ return false;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.effect(target, { name: "bingliang" }, player, player);
+ })
+ .set("cards", cards);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool && result.targets && result.targets.length) {
+ event.current = result.targets[0];
+ if (event.cards.length == 1) {
+ event.directCard = event.cards[0];
+ } else {
+ delete event.directCard;
+ player
+ .chooseCardButton("选择一张牌当作兵断寸断使用", event.cards, true)
+ .set("filterButton", function (button) {
+ return player.canUse({ name: "bingliang", cards: [button.link] }, _status.event.target, false);
+ })
+ .set("target", event.current);
+ }
+ } else {
+ event.finish();
+ }
+ "step 3";
+ var card;
+ if (event.directCard) {
+ card = event.directCard;
+ } else if (result.links && result.links.length && event.cards.includes(result.links[0])) {
+ card = result.links[0];
+ }
+ if (card) {
+ event.cards.remove(card);
+ player.line(event.current);
+ player.useCard({ name: "bingliang" }, event.current, [card], "reshenduan").animate = false;
+ event.goto(1);
+ }
+ },
+ },
+ reyonglve: {
+ audio: 2,
+ trigger: { global: "phaseJudgeBegin" },
+ direct: true,
+ filter: function (event, player) {
+ return event.player != player && event.player.countCards("j") > 0;
+ },
+ content: function () {
+ "step 0";
+ var att = get.attitude(player, trigger.player);
+ var nh = trigger.player.countCards("h");
+ var eff = get.effect(trigger.player, { name: "sha", isCard: true }, player, player);
+ if (player.inRange(trigger.player) || !player.canUse({ name: "sha", isCard: true }, trigger.player, false)) eff = 0;
+ player
+ .discardPlayerCard(get.prompt("yonglve", trigger.player), trigger.player, "j")
+ .set("ai", function (button) {
+ var name = button.link.viewAs || button.link.name;
+ var att = _status.event.att;
+ var nh = _status.event.nh;
+ var eff = _status.event.eff;
+ var trigger = _status.event.getTrigger();
+ if (att > 0 && eff >= 0) return 1;
+ if (att >= 0 && eff > 0) return 1;
+ if (
+ att > 0 &&
+ (trigger.player.hp >= 3 ||
+ trigger.player.hasSkillTag("freeShan", false, {
+ player: _status.event.player,
+ card: new lib.element.VCard({ name: "sha", isCard: true }),
+ }) ||
+ trigger.player.countCards("h", "shan"))
+ ) {
+ if (name == "lebu" && nh > trigger.player.hp) return 1;
+ if (name == "bingliang" && nh < trigger.player.hp) return 1;
+ }
+ return 0;
+ })
+ .set("att", att)
+ .set("nh", nh)
+ .set("eff", eff)
+ .set("logSkill", ["reyonglve", trigger.player]);
+ "step 1";
+ if (result.bool) {
+ if (!player.inRange(trigger.player) && player.canUse({ name: "sha", isCard: true }, trigger.player, false)) {
+ player.useCard({ name: "sha", isCard: true }, trigger.player);
+ } else player.draw();
+ }
+ },
+ },
+ yonglve: {
+ trigger: { global: "phaseJudgeBegin" },
+ direct: true,
+ audio: 2,
+ filter: function (event, player) {
+ return event.player != player && event.player.countCards("j") > 0 && player.inRange(event.player);
+ },
+ content: function () {
+ "step 0";
+ var att = get.attitude(player, trigger.player);
+ var nh = trigger.player.countCards("h");
+ var eff = get.effect(trigger.player, { name: "sha", isCard: true }, player, player);
+ if (!player.canUse({ name: "sha", isCard: true }, trigger.player)) eff = 0;
+ player
+ .discardPlayerCard(get.prompt("yonglve", trigger.player), trigger.player, "j")
+ .set("ai", function (button) {
+ var name = button.link.viewAs || button.link.name;
+ var att = _status.event.att;
+ var nh = _status.event.nh;
+ var eff = _status.event.eff;
+ var trigger = _status.event.getTrigger();
+ if (att > 0 && eff >= 0) return 1;
+ if (att >= 0 && eff > 0) return 1;
+ if (
+ att > 0 &&
+ (trigger.player.hp >= 3 ||
+ trigger.player.hasSkillTag("freeShan", false, {
+ player: _status.event.player,
+ card: new lib.element.VCard({ name: "sha", isCard: true }),
+ }) ||
+ trigger.player.countCards("h", "shan"))
+ ) {
+ if (name == "lebu" && nh > trigger.player.hp) return 1;
+ if (name == "bingliang" && nh < trigger.player.hp) return 1;
+ }
+ return 0;
+ })
+ .set("att", att)
+ .set("nh", nh)
+ .set("eff", eff)
+ .set("logSkill", ["yonglve", trigger.player]);
+ "step 1";
+ if (result.bool) {
+ if (player.canUse({ name: "sha", isCard: true }, trigger.player)) {
+ event.related = player.useCard({ name: "sha", isCard: true }, trigger.player);
+ }
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (
+ !event.related ||
+ !game.hasPlayer2(function (current) {
+ return (
+ current.getHistory("damage", function (evt) {
+ return evt.getParent(2) == event.related;
+ }).length > 0
+ );
+ })
+ ) {
+ player.draw();
+ }
+ },
+ //group:'yonglve2'
+ },
+ yonglve2: {
+ trigger: { source: "damage" },
+ forced: true,
+ popup: false,
+ filter: function (event) {
+ return event.parent.skill == "yonglve";
+ },
+ content: function () {
+ player.storage.yonglve = true;
+ },
+ },
+ benxi: {
+ audio: 2,
+ trigger: { player: "useCard2" },
+ forced: true,
+ filter: function (event, player) {
+ return player.isPhaseUsing();
+ },
+ content: function () {},
+ mod: {
+ globalFrom: function (from, to, distance) {
+ if (_status.currentPhase == from) {
+ return distance - from.countUsed();
+ }
+ },
+ selectTarget: function (card, player, range) {
+ if (_status.currentPhase == player) {
+ if (card.name == "sha" && range[1] != -1) {
+ if (
+ !game.hasPlayer(function (current) {
+ return get.distance(player, current) > 1;
+ })
+ ) {
+ range[1]++;
+ }
+ }
+ }
+ },
+ },
+ ai: {
+ unequip: true,
+ skillTagFilter: function (player) {
+ if (
+ game.hasPlayer(function (current) {
+ return get.distance(player, current) > 1;
+ })
+ ) {
+ return false;
+ }
+ },
+ },
+ },
+ sidi: {
+ audio: 2,
+ trigger: { global: "useCard" },
+ filter: function (event, player) {
+ if (event.card.name != "shan") return false;
+ if (event.player == player) return true;
+ return _status.currentPhase == player;
+ },
+ frequent: true,
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ content: function () {
+ player.addToExpansion(get.cards(), "gain2").gaintag.add("sidi");
+ },
+ group: "sidi2",
+ },
+ sidi2: {
+ trigger: { global: "phaseUseBegin" },
+ filter: function (event, player) {
+ if (event.player == player || event.player.isDead()) return false;
+ if (!player.getExpansions("sidi").length) return false;
+ return true;
+ },
+ check: function (event, player) {
+ if (get.attitude(player, event.player) >= 0) return false;
+ if (event.player.getEquip("zhuge")) return false;
+ if (event.player.hasSkill("paoxiao")) return false;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (event.player.canUse("sha", players[i]) && get.attitude(player, players[i]) > 0) break;
+ }
+ if (i == players.length) return false;
+ var nh = event.player.countCards("h");
+ var nsha = event.player.countCards("h", "sha");
+ if (nh < 2) return false;
+ switch (nh) {
+ case 2:
+ if (nsha) return Math.random() < 0.4;
+ return Math.random() < 0.2;
+ case 3:
+ if (nsha) return Math.random() < 0.8;
+ return Math.random() < 0.3;
+ case 4:
+ if (nsha > 1) return true;
+ if (nsha) return Math.random() < 0.9;
+ return Math.random() < 0.5;
+ default:
+ return true;
+ }
+ },
+ logTarget: "player",
+ content: function () {
+ "step 0";
+ var cards = player.getExpansions("sidi");
+ if (cards.length == 1) {
+ event.directbutton = cards[0];
+ } else {
+ player.chooseCardButton("弃置一张“司敌”牌", cards, true);
+ }
+ "step 1";
+ var button;
+ if (event.directbutton) {
+ button = event.directbutton;
+ } else if (result.bool && result.links && result.links.length) {
+ button = result.links[0];
+ }
+ if (button) {
+ player.loseToDiscardpile(button);
+ trigger.player.addTempSkill("sidi3", "phaseUseAfter");
+ trigger.player.addMark("sidi3", 1, false);
+ }
+ },
+ },
+ sidi3: {
+ mod: {
+ cardUsable: function (card, player, num) {
+ if (card.name == "sha") return num - player.countMark("sidi3");
+ },
+ },
+ onremove: true,
+ },
+ zhongyong: {
+ audio: 2,
+ trigger: { player: "shaMiss" },
+ direct: true,
+ filter: function (event, player) {
+ return event.responded && get.itemtype(event.responded.cards) == "cards";
+ },
+ content: function () {
+ "step 0";
+ var cards = trigger.responded.cards;
+ event.cards = cards;
+ player
+ .chooseTarget("忠勇:将" + get.translation(trigger.responded.cards) + "交给一名角色", function (card, player, target) {
+ return target != _status.event.source;
+ })
+ .set("ai", function (target) {
+ var att = get.attitude(_status.event.player, target);
+ if (target.countCards("h", "shan") && target.countCards("h") >= 2) {
+ att /= 1.5;
+ }
+ return att;
+ })
+ .set("source", trigger.target);
+ "step 1";
+ if (result.bool) {
+ player.logSkill("zhongyong", result.targets);
+ result.targets[0].gain(event.cards, "gain2");
+ if (result.targets[0] == player) {
+ event.finish();
+ }
+ } else {
+ event.finish();
+ }
+ "step 2";
+ player.chooseToUse("是否对" + get.translation(trigger.target) + "再使用一张杀?", { name: "sha" }, trigger.target, -1).set("addCount", false);
+ },
+ },
+ xinzhongyong: {
+ trigger: { player: "useCardAfter" },
+ audio: "zhongyong",
+ direct: true,
+ filter: function (event, player) {
+ return event.card.name == "sha";
+ },
+ content: function () {
+ "step 0";
+ event.sha = trigger.cards.slice(0).filterInD();
+ event.shan = [];
+ game.countPlayer2(function (current) {
+ current.getHistory("useCard", function (evt) {
+ if (evt.card.name == "shan" && evt.getParent(3) == trigger) event.shan.addArray(evt.cards);
+ });
+ });
+ event.shan.filterInD("d");
+ if (!event.sha.length && !event.shan.length) event.finish();
+ player
+ .chooseTarget(get.prompt2("xinzhongyong"), function (card, player, target) {
+ return !_status.event.source.includes(target) && target != player;
+ })
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ })
+ .set("source", trigger.targets);
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ event.target = target;
+ player.logSkill("xinzhongyong", target);
+ if (event.sha.length && event.shan.length) {
+ player
+ .chooseControl()
+ .set("choiceList", ["将" + get.translation(event.sha) + "交给" + get.translation(target), "将" + get.translation(event.shan) + "交给" + get.translation(target)])
+ .set("ai", function () {
+ return _status.event.choice;
+ })
+ .set(
+ "choice",
+ (function () {
+ if (get.color(event.sha) != "black") return 0;
+ return 1;
+ })()
+ );
+ } else event._result = { index: event.sha.length ? 0 : 1 };
+ } else {
+ event.finish();
+ }
+ "step 2";
+ var cards = result.index == 0 ? event.sha : event.shan;
+ event.useSha = false;
+ target.gain(cards, "gain2");
+ for (var i = 0; i < cards.length; i++) {
+ if (get.color(cards[i]) == "red") {
+ event.useSha = true;
+ break;
+ }
+ }
+ "step 3";
+ if (event.useSha) {
+ event.target
+ .chooseToUse("是否使用一张杀?", { name: "sha" })
+ .set("filterTarget", function (card, player, target) {
+ return target != _status.event.sourcex && _status.event.sourcex.inRange(target) && lib.filter.targetEnabled.apply(this, arguments);
+ })
+ .set("sourcex", player)
+ .set("addCount", false);
+ }
+ },
+ },
+ dangxian: {
+ trigger: { player: "phaseBegin" },
+ forced: true,
+ audio: 2,
+ audioname: ["guansuo"],
+ content: function () {
+ trigger.phaseList.splice(trigger.num, 0, "phaseUse|dangxian");
+ },
+ },
+ longyin: {
+ audio: 2,
+ shaRelated: true,
+ init: player => {
+ game.addGlobalSkill("longyin_order");
+ },
+ onremove: player => {
+ if (!game.hasPlayer(current => current.hasSkill("longyin"), true)) game.removeGlobalSkill("longyin_order");
+ },
+ trigger: { global: "useCard" },
+ direct: true,
+ filter: function (event, player) {
+ return event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing();
+ },
+ content: function () {
+ "step 0";
+ var go = false;
+ if (get.attitude(player, trigger.player) > 0) {
+ if (get.color(trigger.card) == "red") {
+ go = true;
+ } else if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false;
+ else if (!trigger.player.hasSkill("paoxiao") && !trigger.player.hasSkill("tanlin3") && !trigger.player.hasSkill("zhaxiang2") && !trigger.player.hasSkill("fengnu") && !trigger.player.getEquip("zhuge")) {
+ var nh = trigger.player.countCards("h");
+ if (player == trigger.player) {
+ go = player.countCards("h", "sha") > 0;
+ } else if (nh >= 4) {
+ go = true;
+ } else if (player.countCards("h", "sha")) {
+ if (nh == 3) {
+ go = Math.random() < 0.8;
+ } else if (nh == 2) {
+ go = Math.random() < 0.5;
+ }
+ } else if (nh >= 3) {
+ if (nh == 3) {
+ go = Math.random() < 0.5;
+ } else if (nh == 2) {
+ go = Math.random() < 0.2;
+ }
+ }
+ }
+ }
+ //AI停顿
+ if (
+ go &&
+ !event.isMine() &&
+ !event.isOnline() &&
+ player.hasCard(function (card) {
+ return get.value(card) < 6 && lib.filter.cardDiscardable(card, player, event.name);
+ }, "he")
+ ) {
+ game.delayx();
+ }
+ var next = player.chooseToDiscard(get.prompt("longyin"), "弃置一张牌" + (get.color(trigger.card) == "red" ? "并摸一张牌" : "") + ",令" + get.translation(trigger.player) + "本次使用的【杀】不计入使用次数", "he");
+ next.logSkill = ["longyin", trigger.player];
+ next.set("ai", function (card) {
+ if (_status.event.go) {
+ return 6 - get.value(card);
+ }
+ return 0;
+ });
+ next.set("go", go);
+ "step 1";
+ if (result.bool) {
+ if (trigger.addCount !== false) {
+ trigger.addCount = false;
+ trigger.player.getStat().card.sha--;
+ }
+ if (get.color(trigger.card) == "red") {
+ player.draw();
+ }
+ // player.logSkill('longyin',trigger.player);
+ }
+ },
+ ai: {
+ expose: 0.2,
+ },
+ subSkill: {
+ order: {
+ mod: {
+ aiOrder: (player, card, num) => {
+ if (num && card.name === "sha" && get.color(card) === "red") {
+ let gp = game.findPlayer(current => {
+ return current.hasSkill("longyin") && current.hasCard(i => true, "he");
+ });
+ if (gp) return num + 0.15 * Math.sign(get.attitude(player, gp));
+ }
+ },
+ },
+ trigger: { player: "dieAfter" },
+ filter: (event, player) => {
+ return !game.hasPlayer(current => current.hasSkill("longyin"), true);
+ },
+ silent: true,
+ forceDie: true,
+ charlotte: true,
+ content: () => {
+ game.removeGlobalSkill("longyin_order");
+ },
+ },
+ },
+ },
+ jigong: {
+ audio: 2,
+ trigger: { player: "phaseUseBegin" },
+ check: function (event, player) {
+ var nh = player.countCards("h") - player.countCards("h", { type: "equip" });
+ if (nh <= 1) return true;
+ if (player.countCards("h", "tao")) return false;
+ if (nh <= 2) return Math.random() < 0.7;
+ if (nh <= 3) return Math.random() < 0.4;
+ return false;
+ },
+ content: function () {
+ player.draw(2);
+ player.addTempSkill("jigong2");
+ },
+ },
+ jigong2: {
+ mod: {
+ maxHandcardBase: function (player, num) {
+ var damage = player.getStat().damage;
+ if (typeof damage == "number") return damage;
+ return 0;
+ },
+ },
+ },
+ shifei: {
+ audio: 2,
+ audioname: ["re_guotufengji"],
+ enable: ["chooseToRespond", "chooseToUse"],
+ filter: function (event, player) {
+ if (!_status.currentPhase || event.shifei) return false;
+ if (!event.filterCard({ name: "shan", isCard: true }, player, event)) return false;
+ if (event.name != "chooseToUse" && !lib.filter.cardRespondable({ name: "shan", isCard: true }, player, event)) return false;
+ return true;
+ },
+ delay: false,
+ checkx: function (player) {
+ if (get.attitude(player, _status.currentPhase) > 0) return true;
+ var nh = _status.currentPhase.countCards("h") + 1;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (players[i].countCards("h") >= nh) {
+ if (!player.countCards("h", "shan") || get.attitude(player, players[i]) <= 0) return true;
+ }
+ }
+ return false;
+ },
+ content: function () {
+ "step 0";
+ player.line(_status.currentPhase, "green");
+ _status.currentPhase.draw();
+ "step 1";
+ if (_status.currentPhase.isMaxHandcard(true)) {
+ event.finish();
+ var evt = event.getParent(2);
+ evt.set("shifei", true);
+ evt.goto(0);
+ return;
+ }
+ var targets = game.filterPlayer(function (current) {
+ return current.isMaxHandcard();
+ });
+ if (targets.length == 1) {
+ event.onlytarget = targets[0];
+ } else if (targets.length) {
+ player
+ .chooseTarget("选择一名角色弃置其一张牌", true, function (card, player, target) {
+ return _status.event.targets.includes(target);
+ })
+ .set("ai", function (target) {
+ return -get.attitude(_status.event.player, target);
+ })
+ .set("targets", targets);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ var evt = event.getParent(2);
+ var target;
+ if (event.onlytarget) {
+ target = event.onlytarget;
+ } else if (result.targets && result.targets.length) {
+ target = result.targets[0];
+ }
+ if (target) {
+ player.line(target, "green");
+ player.discardPlayerCard(target, "he", true);
+ evt.result = { bool: true, card: { name: "shan", isCard: true }, cards: [] };
+ evt.redo();
+ } else {
+ evt.set("shifei", true);
+ evt.goto(0);
+ }
+ },
+ ai: {
+ respondShan: true,
+ effect: {
+ target: function (card, player, target, current) {
+ if (get.tag(card, "respondShan") && current < 0) {
+ var nh = player.countCards("h");
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (players[i].countCards("h") > nh) return 0.4;
+ }
+ }
+ },
+ },
+ order: 8,
+ result: {
+ player: function (player) {
+ return lib.skill.shifei.checkx(player) ? 1 : 0;
+ },
+ },
+ },
+ },
+ huaiyi: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ delay: false,
+ filter: function (event, player) {
+ return player.countCards("h", { color: "red" }) && player.countCards("h", { color: "black" });
+ },
+ content: function () {
+ "step 0";
+ player.showHandcards();
+ "step 1";
+ player.chooseControl("红色", "黑色").set("ai", function () {
+ var player = _status.event.player;
+ if (player.countCards("h", { color: "red" }) == 1 && player.countCards("h", { color: "black" }) > 1) return "红色";
+ return "黑色";
+ });
+ "step 2";
+ event.control = result.control;
+ var cards;
+ if (event.control == "红色") {
+ cards = player.getCards("h", { color: "red" });
+ } else {
+ cards = player.getCards("h", { color: "black" });
+ }
+ player.discard(cards);
+ event.num = cards.length;
+ "step 3";
+ player
+ .chooseTarget("请选择至多" + get.cnNumber(event.num) + "名有牌的其他角色,获得这些角色的各一张牌。", [1, event.num], function (card, player, target) {
+ return target != player && target.countCards("he") > 0;
+ })
+ .set("ai", function (target) {
+ return -get.attitude(_status.event.player, target) + 0.5;
+ });
+ "step 4";
+ if (result.bool && result.targets) {
+ player.line(result.targets, "green");
+ event.targets = result.targets;
+ event.targets.sort(lib.sort.seat);
+ event.gained = 0;
+ } else {
+ event.finish();
+ }
+ "step 5";
+ if (player.isIn() && event.targets.length) {
+ player.gainPlayerCard(event.targets.shift(), "he", true);
+ } else event.finish();
+ "step 6";
+ if (result.bool) {
+ event.gained += result.cards.length;
+ }
+ if (event.targets.length) event.goto(5);
+ "step 7";
+ if (event.gained > 1) player.loseHp();
+ },
+ ai: {
+ order: function (item, player) {
+ if (player.countCards("h", { color: "red" }) == 1) return 10;
+ if (player.countCards("h", { color: "black" }) == 1) return 10;
+ return 1;
+ },
+ result: {
+ player: 1,
+ },
+ },
+ },
+ yaoming: {
+ audio: 2,
+ trigger: { player: "damageEnd", source: "damageSource" },
+ direct: true,
+ filter: function (event, player) {
+ if (player.hasSkill("yaoming2")) return false;
+ var nh = player.countCards("h");
+ return game.hasPlayer(function (current) {
+ return current.countCards("h") != nh;
+ });
+ },
+ content: function () {
+ "step 0";
+ var nh = player.countCards("h");
+ player
+ .chooseTarget(get.prompt2("yaoming"), function (card, player, target) {
+ return _status.event.nh != target.countCards("h");
+ })
+ .set("ai", function (target) {
+ var att = get.attitude(_status.event.player, target);
+ if (target.countCards("h") > _status.event.nh) return -att;
+ return att;
+ })
+ .set("nh", nh);
+ "step 1";
+ if (result.bool) {
+ player.logSkill("yaoming", result.targets);
+ player.addTempSkill("yaoming2");
+ var target = result.targets[0];
+ if (target.countCards("h") < player.countCards("h")) {
+ target.draw();
+ } else {
+ target.discard(target.getCards("h").randomGet());
+ }
+ }
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ yaoming2: {},
+ anguo: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: function (card, player, target) {
+ return player != target && target.countCards("e") > 0;
+ },
+ content: function () {
+ "step 0";
+ player.choosePlayerCard(target, "e", true);
+ "step 1";
+ if (result.links) {
+ var num = 0,
+ players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (target.inRange(players[i])) {
+ num++;
+ }
+ }
+ event.num = num;
+ target.gain(result.links, "gain2");
+ } else {
+ event.finish();
+ }
+ "step 2";
+ var num2 = 0,
+ players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (target.inRange(players[i])) {
+ num2++;
+ }
+ }
+ if (event.num > num2) {
+ player.draw();
+ }
+ },
+ ai: {
+ order: 7,
+ result: {
+ target: function (player, target) {
+ if (target.hasSkillTag("noe")) return 1;
+ if (target.getEquip(1) || target.getEquip(4)) return -1;
+ if (target.getEquip(2)) return -0.7;
+ return -0.5;
+ },
+ },
+ },
+ },
+ reyanzhu: {
+ enable: "phaseUse",
+ audio: 2,
+ usable: 1,
+ filterTarget: lib.filter.notMe,
+ derivation: ["reyanzhu_rewrite", "rexingxue_rewrite"],
+ prompt: function () {
+ return lib.translate[(_status.event.player.storage.reyanzhu ? "reyanzhu_rewrite" : "reyanzhu") + "_info"];
+ },
+ content: function () {
+ "step 0";
+ if (player.storage.reyanzhu || !target.countCards("e")) event._result = { index: 1 };
+ else
+ target
+ .chooseControl()
+ .set("prompt", get.translation(player) + "发动了【宴诛】,请选择一项")
+ .set("choiceList", ["将装备区内的所有牌交给" + get.translation(player) + "并令其修改技能", "弃置一张牌,并令下次受到的伤害+1直到下回合开始"])
+ .set("ai", function () {
+ if (_status.event.player.countCards("e") >= 3) return 1;
+ return 0;
+ });
+ "step 1";
+ if (result.index == 0) {
+ target.give(target.getCards("e"), player);
+ player.storage.reyanzhu = true;
+ } else {
+ target.addTempSkill("reyanzhu2", { player: "phaseBegin" });
+ target.addMark("reyanzhu2", 1, false);
+ if (!player.storage.reyanzhu && target.countCards("he") > 0) target.chooseToDiscard("he", true);
+ }
+ },
+ ai: {
+ order: 6,
+ result: {
+ target: function (player, target) {
+ if (player.storage.reyanzhu) return -1;
+ var ne = target.countCards("e");
+ if (!ne) return -2;
+ if (ne >= 2) return -ne;
+ return 0;
+ },
+ },
+ },
+ },
+ reyanzhu2: {
+ trigger: { player: "damageBegin3" },
+ forced: true,
+ onremove: true,
+ content: function () {
+ trigger.num += player.countMark("reyanzhu2");
+ game.log(player, "受到的伤害+" + player.countMark("reyanzhu2"));
+ player.removeSkill("reyanzhu2");
+ },
+ intro: {
+ content: "下次受到的伤害+#直到下回合开始",
+ },
+ },
+ rexingxue: {
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ audio: 2,
+ filter: function (event, player) {
+ return (player.storage.reyanzhu ? player.maxHp : player.hp) > 0;
+ },
+ content: function () {
+ "step 0";
+ player.chooseTarget([1, player.storage.reyanzhu ? player.maxHp : player.hp], get.prompt("rexingxue"), "令所有目标角色依次摸一张牌,然后所有手牌数大于体力值的目标角色依次将一张牌置于牌堆顶").set("ai", function (target) {
+ var att = get.attitude(player, target);
+ if (target.countCards("h") == target.hp - 1) att *= 2;
+ return att;
+ });
+ "step 1";
+ if (result.bool) {
+ event.targets = result.targets.sortBySeat();
+ player.logSkill("rexingxue", event.targets);
+ game.asyncDraw(result.targets);
+ } else event.finish();
+ "step 2";
+ game.delay();
+ "step 3";
+ if (event.targets.length) {
+ event.target = event.targets.shift();
+ if (event.target.isDead()) event.redo();
+ } else event.finish();
+ "step 4";
+ if (target.isIn() && target.countCards("h") && target.countCards("h") > target.hp) target.chooseCard("he", true, "将一张牌置于牌堆顶");
+ else event.goto(3);
+ "step 5";
+ if (result && result.cards) {
+ event.card = result.cards[0];
+ target.lose(result.cards, ui.cardPile, "insert");
+ game.log(target, "将", get.position(event.card) == "h" ? "一张牌" : event.card, "置于牌堆顶");
+ game.broadcastAll(function (player) {
+ var cardx = ui.create.card();
+ cardx.classList.add("infohidden");
+ cardx.classList.add("infoflip");
+ player.$throw(cardx, 1000, "nobroadcast");
+ }, target);
+ }
+ event.goto(3);
+ },
+ },
+ rezhaofu: {
+ unique: true,
+ global: "rezhaofu2",
+ zhuSkill: true,
+ },
+ rezhaofu2: {
+ mod: {
+ inRangeOf: function (from, to) {
+ if (from.group != "wu") return;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (from != players[i] && to != players[i] && players[i].hasZhuSkill("rezhaofu", from)) {
+ if (players[i].inRange(to)) return true;
+ }
+ }
+ },
+ },
+ },
+ zhaofu: {
+ unique: true,
+ global: "zhaofu2",
+ zhuSkill: true,
+ locked: true,
+ },
+ zhaofu2: {
+ mod: {
+ inRangeOf: function (from, to) {
+ if (from.group != "wu") return;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (from != players[i] && to != players[i] && players[i].hasZhuSkill("zhaofu", from)) {
+ if (get.distance(players[i], to) <= 1) return true;
+ }
+ }
+ },
+ },
+ },
+ xingxue: {
+ audio: 2,
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ async content(event, trigger, player) {
+ var num = player.hp;
+ if (!player.hasSkill("yanzhu")) {
+ num = player.maxHp;
+ }
+ const {
+ result: { targets, bool },
+ } = await player.chooseTarget([1, num], get.prompt2("xingxue")).set("ai", function (target) {
+ var att = get.attitude(_status.event.player, target);
+ if (target.countCards("he")) return att;
+ return att / 10;
+ });
+ if (bool) {
+ player.logSkill("xingxue", targets);
+ const chooseToPutCard = async function (target) {
+ await target.draw();
+ if (target.countCards("he")) {
+ const {
+ result: { cards, bool },
+ } = await target.chooseCard("选择一张牌置于牌堆顶", "he", true);
+ if (bool) {
+ await target.lose(cards, ui.cardPile, "insert");
+ }
+ game.broadcastAll(function (player) {
+ var cardx = ui.create.card();
+ cardx.classList.add("infohidden");
+ cardx.classList.add("infoflip");
+ player.$throw(cardx, 1000, "nobroadcast");
+ }, target);
+ if (player == game.me) {
+ await game.asyncDelay(0.5);
+ }
+ }
+ };
+ await game.doAsyncInOrder(targets, chooseToPutCard);
+ }
+ },
+ },
+ yanzhu: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: function (card, player, target) {
+ return target.countCards("he") > 0 && target != player;
+ },
+ content: function () {
+ "step 0";
+ if (target.countCards("e")) {
+ target.chooseBool("是否将装备区内的所有牌交给" + get.translation(player) + "?").set("ai", function () {
+ if (_status.event.player.countCards("e") >= 3) return false;
+ return true;
+ });
+ } else {
+ target.chooseToDiscard(true, "he");
+ event.finish();
+ }
+ "step 1";
+ if (result.bool) {
+ var es = target.getCards("e");
+ target.give(es, player, "give");
+ player.removeSkills("yanzhu");
+ } else {
+ target.chooseToDiscard(true, "he");
+ }
+ },
+ ai: {
+ order: 6,
+ result: {
+ target: function (player, target) {
+ var ne = target.countCards("e");
+ if (!ne) return -2;
+ if (ne >= 2) return -ne;
+ return 0;
+ },
+ },
+ },
+ },
+ shizhi: {
+ mod: {
+ cardname: function (card, player, name) {
+ if (card.name == "shan" && player.hp == 1) return "sha";
+ },
+ },
+ ai: {
+ skillTagFilter: function (player) {
+ if (!player.countCards("h", "shan")) return false;
+ if (player.hp != 1) return false;
+ },
+ respondSha: true,
+ halfneg: true,
+ },
+ audio: 2,
+ audioname: ["xin_zhangyi"],
+ trigger: { player: ["useCard1", "respond"] },
+ firstDo: true,
+ forced: true,
+ filter: function (event, player) {
+ return event.card.name == "sha" && !event.skill && event.cards.length == 1 && event.cards[0].name == "shan";
+ },
+ content: function () {},
+ },
+ wurong: {
+ enable: "phaseUse",
+ usable: 1,
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ filterTarget: function (card, player, target) {
+ return target.countCards("h") > 0 && target != player;
+ },
+ content: function () {
+ "step 0";
+ if (target.countCards("h") == 0 || player.countCards("h") == 0) {
+ event.finish();
+ return;
+ }
+ "step 1";
+ var sendback = function () {
+ if (_status.event != event) {
+ return function () {
+ event.resultOL = _status.event.resultOL;
+ };
+ }
+ };
+ if (player.isOnline()) {
+ player.wait(sendback);
+ event.ol = true;
+ player.send(function () {
+ game.me.chooseCard(true).set("glow_result", true).ai = function () {
+ return Math.random();
+ };
+ game.resume();
+ });
+ } else {
+ event.localPlayer = true;
+ player.chooseCard(true).set("glow_result", true).ai = function () {
+ return Math.random();
+ };
+ }
+ if (target.isOnline()) {
+ target.wait(sendback);
+ event.ol = true;
+ target.send(function () {
+ var rand = Math.random() < 0.4;
+ game.me.chooseCard(true).set("glow_result", true).ai = function (card) {
+ if (rand) return card.name == "shan" ? 1 : 0;
+ return card.name == "shan" ? 0 : 1;
+ };
+ game.resume();
+ });
+ } else {
+ event.localTarget = true;
+ }
+ "step 2";
+ if (event.localPlayer) {
+ event.card1 = result.cards[0];
+ }
+ if (event.localTarget) {
+ var rand = Math.random() < 0.4;
+ target.chooseCard(true).set("glow_result", true).ai = function (card) {
+ if (rand) return card.name == "shan" ? 1 : 0;
+ return card.name == "shan" ? 0 : 1;
+ };
+ }
+ "step 3";
+ if (event.localTarget) {
+ event.card2 = result.cards[0];
+ }
+ if (!event.resultOL && event.ol) {
+ game.pause();
+ }
+ "step 4";
+ try {
+ if (!event.card1) event.card1 = event.resultOL[player.playerid].cards[0];
+ if (!event.card2) event.card2 = event.resultOL[target.playerid].cards[0];
+ if (!event.card1 || !event.card2) {
+ throw "err";
+ }
+ } catch (e) {
+ console.log(e);
+ event.finish();
+ return;
+ }
+ game.broadcastAll(
+ function (card1, card2) {
+ card1.classList.remove("glow");
+ card2.classList.remove("glow");
+ },
+ event.card1,
+ event.card2
+ );
+ "step 5";
+ game.broadcastAll(function () {
+ ui.arena.classList.add("thrownhighlight");
+ });
+ game.addVideo("thrownhighlight1");
+ player.$compare(event.card1, target, event.card2);
+ game.delay(4);
+ "step 6";
+ var next = game.createEvent("showCards");
+ next.player = player;
+ next.cards = [event.card1];
+ next.setContent("emptyEvent");
+ game.log(player, "展示了", event.card1);
+ "step 7";
+ var next = game.createEvent("showCards");
+ next.player = target;
+ next.cards = [event.card2];
+ next.setContent("emptyEvent");
+ game.log(target, "展示了", event.card2);
+ "step 8";
+ var name1 = get.name(event.card1);
+ var name2 = get.name(event.card2);
+ if (name1 == "sha" && name2 != "shan") {
+ player.discard(event.card1).set("animate", false);
+ target.$gain2(event.card2);
+ var clone = event.card1.clone;
+ if (clone) {
+ clone.style.transition = "all 0.5s";
+ clone.style.transform = "scale(1.2)";
+ clone.delete();
+ game.addVideo("deletenode", player, get.cardsInfo([clone]));
+ }
+ game.broadcast(function (card) {
+ var clone = card.clone;
+ if (clone) {
+ clone.style.transition = "all 0.5s";
+ clone.style.transform = "scale(1.2)";
+ clone.delete();
+ }
+ }, event.card1);
+ target.damage("nocard");
+ } else if (name1 != "sha" && name2 == "shan") {
+ player.discard(event.card1).set("animate", false);
+ target.$gain2(event.card2);
+ var clone = event.card1.clone;
+ if (clone) {
+ clone.style.transition = "all 0.5s";
+ clone.style.transform = "scale(1.2)";
+ clone.delete();
+ game.addVideo("deletenode", player, get.cardsInfo([clone]));
+ }
+ game.broadcast(function (card) {
+ var clone = card.clone;
+ if (clone) {
+ clone.style.transition = "all 0.5s";
+ clone.style.transform = "scale(1.2)";
+ clone.delete();
+ }
+ }, event.card1);
+ player.gainPlayerCard(target, true, "he");
+ } else {
+ player.$gain2(event.card1);
+ target.$gain2(event.card2);
+ }
+ game.broadcastAll(function () {
+ ui.arena.classList.remove("thrownhighlight");
+ });
+ game.addVideo("thrownhighlight2");
+ },
+ ai: {
+ order: 6,
+ result: {
+ target: -1,
+ },
+ },
+ },
+ zhanjue: {
+ audio: 2,
+ enable: "phaseUse",
+ filterCard: true,
+ selectCard: -1,
+ position: "h",
+ filter: function (event, player) {
+ if (player.getStat().skill.zhanjue_draw && player.getStat().skill.zhanjue_draw >= 2) return false;
+ var hs = player.getCards("h");
+ if (!hs.length) return false;
+ for (var i = 0; i < hs.length; i++) {
+ var mod2 = game.checkMod(hs[i], player, "unchanged", "cardEnabled2", player);
+ if (mod2 === false) return false;
+ }
+ return true;
+ },
+ viewAs: { name: "juedou" },
+ group: ["zhanjue4"],
+ ai: {
+ damage: true,
+ order: 1,
+ effect: {
+ player: function (card, player, target) {
+ if (_status.event.skill == "zhanjue") {
+ if (
+ player.hasSkillTag(
+ "directHit_ai",
+ true,
+ {
+ target: target,
+ card: card,
+ },
+ true
+ )
+ )
+ return;
+ if (player.countCards("h") >= 3 || target.countCards("h") >= 3) return "zeroplayertarget";
+ if (player.countCards("h", "tao")) return "zeroplayertarget";
+ if (target.countCards("h", "sha") > 1) return "zeroplayertarget";
+ }
+ },
+ },
+ nokeep: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && player.countSkill("zhanjue_draw") < 2 && player.hasCard(card => get.name(card) != "tao", "h");
+ },
+ },
+ },
+ zhanjue2: {
+ audio: false,
+ trigger: { player: "phaseBefore" },
+ silent: true,
+ content: function () {
+ player.storage.zhanjue = 0;
+ },
+ },
+ zhanjue3: {
+ audio: false,
+ trigger: { player: "damageAfter", source: "damageAfter" },
+ forced: true,
+ popup: false,
+ filter: function (event, player) {
+ return event.parent.skill == "zhanjue";
+ },
+ content: function () {
+ trigger.player.addTempSkill("zhanjue5");
+ },
+ },
+ zhanjue4: {
+ audio: false,
+ trigger: { player: "useCardAfter" },
+ forced: true,
+ popup: false,
+ filter: function (event, player) {
+ return event.skill == "zhanjue";
+ },
+ content: function () {
+ "step 0";
+ var stat = player.getStat().skill;
+ if (!stat.zhanjue_draw) stat.zhanjue_draw = 0;
+ stat.zhanjue_draw++;
+ player.draw("nodelay");
+ var list = game.filterPlayer(function (current) {
+ if (
+ current.getHistory("damage", function (evt) {
+ return evt.card == trigger.card;
+ }).length > 0
+ ) {
+ if (current == player) {
+ stat.zhanjue_draw++;
+ }
+ return true;
+ }
+ return false;
+ });
+ if (list.length) {
+ list.sortBySeat();
+ game.asyncDraw(list);
+ }
+ "step 1";
+ game.delay();
+ },
+ },
+ zhanjue5: {},
+ qinwang: {
+ audio: "qinwang1",
+ unique: true,
+ group: ["qinwang1"],
+ zhuSkill: true,
+ filter: function (event, player) {
+ if (
+ !player.hasZhuSkill("qinwang") ||
+ !game.hasPlayer(function (current) {
+ return current != player && current.group == "shu";
+ }) ||
+ !player.countCards("he")
+ )
+ return false;
+ return !event.jijiang && (event.type != "phase" || !player.hasSkill("jijiang3"));
+ },
+ enable: ["chooseToUse", "chooseToRespond"],
+ viewAs: {
+ name: "sha",
+ cards: [],
+ suit: "none",
+ number: null,
+ isCard: true,
+ },
+ filterCard: lib.filter.cardDiscardable,
+ position: "he",
+ check: function (card) {
+ var player = _status.event.player,
+ players = game.filterPlayer();
+ if (player.hasSkill("qinwang_ai")) return false;
+ for (var i = 0; i < players.length; i++) {
+ var nh = players[i].countCards("h");
+ if (players[i] != player && players[i].group == "shu" && get.attitude(players[i], player) > 2 && nh >= 3 && players[i].countCards("h", "sha")) {
+ return 5 - get.value(card);
+ }
+ }
+ return 0;
+ },
+ ai: {
+ order: function () {
+ return get.order({ name: "sha" }) - 0.3;
+ },
+ respondSha: true,
+ skillTagFilter: function (player) {
+ if (
+ !player.hasZhuSkill("qinwang") ||
+ !game.hasPlayer(function (current) {
+ return current != player && current.group == "shu";
+ }) ||
+ !player.countCards("he")
+ )
+ return false;
+ },
+ },
+ },
+ qinwang1: {
+ audio: 2,
+ trigger: { player: ["useCardBegin", "respondBegin"] },
+ logTarget: "targets",
+ filter: function (event, player) {
+ return event.skill == "qinwang";
+ },
+ forced: true,
+ content: function () {
+ "step 0";
+ delete trigger.skill;
+ delete trigger.card.cards;
+ player.discard(trigger.cards);
+ delete trigger.cards;
+ trigger.getParent().set("jijiang", true);
+ "step 1";
+ if (event.current == undefined) event.current = player.next;
+ if (event.current == player) {
+ player.addTempSkill("jijiang3");
+ player.addTempSkill("qinwang_ai");
+ event.finish();
+ trigger.cancel();
+ trigger.getParent().goto(0);
+ } else if (event.current.group == "shu") {
+ var next = event.current.chooseToRespond("是否替" + get.translation(player) + "打出一张杀?", { name: "sha" });
+ next.set("ai", function () {
+ var event = _status.event;
+ return get.attitude(event.player, event.source) - 2;
+ });
+ next.set("source", player);
+ next.set("jijiang", true);
+ next.set("skillwarn", "替" + get.translation(player) + "打出一张杀");
+ next.noOrdering = true;
+ next.autochoose = lib.filter.autoRespondSha;
+ } else {
+ event.current = event.current.next;
+ event.redo();
+ }
+ "step 2";
+ if (result.bool) {
+ event.current.draw();
+ event.finish();
+ trigger.card = result.card;
+ trigger.cards = result.cards;
+ trigger.throw = false;
+ if (typeof event.current.ai.shown == "number" && event.current.ai.shown < 0.95) {
+ event.current.ai.shown += 0.3;
+ if (event.current.ai.shown > 0.95) event.current.ai.shown = 0.95;
+ }
+ } else {
+ event.current = event.current.next;
+ event.goto(1);
+ }
+ },
+ },
+ qinwang_ai: {},
+ zuoding: {
+ audio: 2,
+ audioname: ["re_zhongyao"],
+ trigger: { global: "useCardToPlayered" },
+ filter: function (event, player) {
+ if (event.getParent().triggeredTargets3.length > 1) return false;
+ return (
+ get.suit(event.card) == "spade" &&
+ _status.currentPhase == event.player &&
+ event.targets &&
+ event.targets.length &&
+ event.player != player &&
+ game.countPlayer2(function (current) {
+ return current.getHistory("damage").length > 0;
+ }) == 0
+ );
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("zuoding"), "令一名目标角色摸一张牌", function (card, player, target) {
+ return _status.event.targets.includes(target);
+ })
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ })
+ .set("targets", trigger.targets);
+ "step 1";
+ if (result.bool) {
+ player.logSkill("zuoding", result.targets);
+ result.targets[0].draw();
+ }
+ },
+ ai: {
+ expose: 0.2,
+ },
+ //group:'zuoding3'
+ },
+ zuoding2: {},
+ zuoding3: {
+ trigger: { global: "damage" },
+ silent: true,
+ content: function () {
+ player.addTempSkill("zuoding2");
+ },
+ },
+ huomo: {
+ audio: 2,
+ audioname: ["huzhao", "re_zhongyao"],
+ enable: "chooseToUse",
+ onChooseToUse: function (event) {
+ if (game.online || event.huomo_list) return;
+ var list = lib.skill.huomo.getUsed(event.player);
+ event.set("huomo_list", list);
+ },
+ getUsed: function (player) {
+ var list = [];
+ player.getHistory("useCard", function (evt) {
+ if (get.type(evt.card, null, false) == "basic") list.add(evt.card.name);
+ });
+ return list;
+ },
+ hiddenCard: function (player, name) {
+ if (get.type(name) != "basic") return false;
+ var list = lib.skill.huomo.getUsed(player);
+ if (list.includes(name)) return false;
+ return player.hasCard(function (card) {
+ return get.color(card) == "black" && get.type(card) != "basic";
+ }, "eh");
+ },
+ filter: function (event, player) {
+ if (
+ event.type == "wuxie" ||
+ !player.hasCard(function (card) {
+ return get.color(card) == "black" && get.type(card) != "basic";
+ }, "eh")
+ )
+ return false;
+ var list = event.huomo_list || lib.skill.huomo.getUsed(player);
+ for (var name of lib.inpile) {
+ if (get.type(name) != "basic" || list.includes(name)) continue;
+ var card = { name: name, isCard: true };
+ if (event.filterCard(card, player, event)) return true;
+ if (name == "sha") {
+ for (var nature of lib.inpile_nature) {
+ card.nature = nature;
+ if (event.filterCard(card, player, event)) return true;
+ }
+ }
+ }
+ return false;
+ },
+ chooseButton: {
+ dialog: function (event, player) {
+ var vcards = [];
+ var list = event.huomo_list || lib.skill.huomo.getUsed(player);
+ for (var name of lib.inpile) {
+ if (get.type(name) != "basic" || list.includes(name)) continue;
+ var card = { name: name, isCard: true };
+ if (event.filterCard(card, player, event)) vcards.push(["基本", "", name]);
+ if (name == "sha") {
+ for (var nature of lib.inpile_nature) {
+ card.nature = nature;
+ if (event.filterCard(card, player, event)) vcards.push(["基本", "", name, nature]);
+ }
+ }
+ }
+ return ui.create.dialog("活墨", [vcards, "vcard"], "hidden");
+ },
+ check: function (button) {
+ var player = _status.event.player;
+ var card = { name: button.link[2], nature: button.link[3] };
+ if (
+ game.hasPlayer(function (current) {
+ return player.canUse(card, current) && get.effect(current, card, player, player) > 0;
+ })
+ ) {
+ switch (button.link[2]) {
+ case "tao":
+ return 5;
+ case "jiu":
+ return 3.01;
+ case "sha":
+ if (button.link[3] == "fire") return 2.95;
+ else if (button.link[3] == "thunder") return 2.92;
+ else return 2.9;
+ case "shan":
+ return 1;
+ }
+ }
+ return 0;
+ },
+ backup: function (links, player) {
+ return {
+ check: function (card) {
+ return 1 / Math.max(0.1, get.value(card));
+ },
+ filterCard: function (card) {
+ return get.type(card) != "basic" && get.color(card) == "black";
+ },
+ viewAs: {
+ name: links[0][2],
+ nature: links[0][3],
+ suit: "none",
+ number: null,
+ isCard: true,
+ },
+ position: "he",
+ popname: true,
+ ignoreMod: true,
+ precontent: function () {
+ player.logSkill("huomo");
+ var card = event.result.cards[0];
+ game.log(player, "将", card, "置于牌堆顶");
+ event.result.card = {
+ name: event.result.card.name,
+ nature: event.result.card.nature,
+ };
+ event.result.cards = [];
+ player.loseToDiscardpile(card, ui.cardPile, "visible", "insert").log = false;
+ },
+ };
+ },
+ prompt: function (links, player) {
+ return "将一张黑色非基本牌置于牌堆顶并视为使用一张" + get.translation(links[0][3] || "") + get.translation(links[0][2]);
+ },
+ },
+ ai: {
+ order: function () {
+ var player = _status.event.player;
+ var event = _status.event;
+ var list = lib.skill.huomo.getUsed(player);
+ if (!list.includes("jiu") && event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0) {
+ return 3.1;
+ }
+ return 2.9;
+ },
+ respondSha: true,
+ fireAttack: true,
+ respondShan: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (tag == "fireAttack") return true;
+ if (
+ player.hasCard(function (card) {
+ return get.color(card) == "black" && get.type(card) != "basic";
+ }, "he")
+ ) {
+ var list = lib.skill.huomo.getUsed(player);
+ if (tag == "respondSha") {
+ if (arg != "use") return false;
+ if (list.includes("sha")) return false;
+ } else if (tag == "respondShan") {
+ if (list.includes("shan")) return false;
+ }
+ } else {
+ return false;
+ }
+ },
+ result: {
+ player: 1,
+ },
+ },
+ },
+ // taoxi:{
+ // audio:2,
+ // trigger:{player:'useCardToPlayered'},
+ // filter:function(event,player){
+ // return _status.currentPhase==player&&event.targets.length==1&&
+ // event.target.countCards('h')>0&&!player.hasSkill('taoxi4')&&player!=event.target;
+ // },
+ // check:function(event,player){
+ // return get.attitude(player,event.target)<0;
+ // },
+ // intro:{
+ // content:'card'
+ // },
+ // content:function(){
+ // var card=trigger.target.getCards('h').randomGet();
+ // player.showCards([card]);
+ // player.storage.taoxi=card;
+ // player.storage.taoxi2=trigger.target;
+ // player.syncStorage('taoxi');
+ // player.markSkill('taoxi');
+ // player.addTempSkill('taoxi4');
+ // },
+ // group:['taoxi2','taoxi3']
+ // },
+ // taoxi2:{
+ // audio:false,
+ // enable:'phaseUse',
+ // filter:function(event,player){
+ // if(player.storage.taoxi&&player.storage.taoxi2&&
+ // get.owner(player.storage.taoxi)==player.storage.taoxi2&&
+ // lib.filter.filterCard(player.storage.taoxi,player,event)){
+ // return true;
+ // }
+ // return false;
+ // },
+ // filterTarget:function(card,player,target){
+ // return player.canUse(player.storage.taoxi,target);
+ // },
+ // selectTarget:function(){
+ // var info=get.info(_status.event.player.storage.taoxi);
+ // if(info.notarget) return -1;
+ // return get.select(info.selectTarget);
+ // },
+ // multitarget:true,
+ // multiline:true,
+ // content:function(){
+ // 'step 0'
+ // var card=player.storage.taoxi;
+ // if(!card){
+ // event.finish();
+ // return;
+ // }
+ // var owner=get.owner(card);
+ // if(owner){
+ // owner.lose(card,ui.special);
+ // }
+ // event.card=card;
+ // player.$throw(card);
+ // 'step 1'
+ // player.useCard(event.card,targets).animate=false;
+ // delete player.storage.taoxi;
+ // delete player.storage.taoxi2;
+ // player.unmarkSkill('taoxi');
+ // },
+ // ai:{
+ // order:8,
+ // result:{
+ // target:function(player,target){
+ // return get.effect(target,player.storage.taoxi,player,target);
+ // },
+ // player:1
+ // }
+ // }
+ // },
+ // taoxi3:{
+ // trigger:{player:'phaseJieshuBegin'},
+ // forced:true,
+ // popup:false,
+ // filter:function(event,player){
+ // return player.storage.taoxi?true:false;
+ // },
+ // content:function(){
+ // if(get.owner(player.storage.taoxi)==player.storage.taoxi2){
+ // player.loseHp();
+ // }
+ // delete player.storage.taoxi;
+ // delete player.storage.taoxi2;
+ // player.unmarkSkill('taoxi');
+ // }
+ // },
+ // taoxi4:{},
+ taoxi: {
+ audio: 2,
+ trigger: { player: "useCardToPlayered" },
+ check: function (event, player) {
+ if (get.attitude(player, event.target) >= 0) return false;
+ var cards = event.target.getCards("h");
+ if (cards.filter(card => player.hasUseTarget(card)).length >= cards.length / 2) return true;
+ return false;
+ },
+ filter: function (event, player) {
+ return player.isPhaseUsing() && event.targets.length == 1 && event.target.countCards("h") > 0 && player != event.target && !player.hasSkill("taoxi_used");
+ },
+ logTarget: "target",
+ content: function () {
+ "step 0";
+ player.choosePlayerCard(trigger.target, "h", true);
+ "step 1";
+ if (result.bool) {
+ var card = result.links[0];
+ player.showCards(card, get.translation(player) + "对" + get.translation(trigger.target) + "发动了【讨袭】");
+ if (!player.storage.taoxi_list) player.storage.taoxi_list = [[], []];
+ if (!player.storage.taoxi_list[1].some(i => i._cardid == card.cardid)) {
+ var cardx = ui.create.card();
+ cardx.init(get.cardInfo(card));
+ cardx._cardid = card.cardid;
+ player.directgains([cardx], null, "taoxi");
+ player.storage.taoxi_list[0].push(trigger.target);
+ player.storage.taoxi_list[1].push(cardx);
+ player.markSkill("taoxi_list");
+ player.addTempSkill("taoxi_list");
+ player.addTempSkill("taoxi_use");
+ player.addTempSkill("taoxi_used", "phaseUseAfter");
+ }
+ }
+ },
+ subSkill: {
+ used: {},
+ use: {
+ trigger: { player: "useCardBefore" },
+ charlotte: true,
+ forced: true,
+ popup: false,
+ firstDo: true,
+ group: "taoxi_lose",
+ filter: function (event, player) {
+ if (!player.storage.taoxi_list || !player.storage.taoxi_list.length) return false;
+ var list = player.storage.taoxi_list[1];
+ return (
+ event.cards &&
+ event.cards.some(card => {
+ return list.includes(card);
+ })
+ );
+ },
+ content: function () {
+ var cards = [],
+ list = player.storage.taoxi_list;
+ for (var card of trigger.cards) {
+ var bool = false;
+ for (var i = 0; i < list[0].length; i++) {
+ if (list[1][i] == card) {
+ var cardid = card._cardid;
+ var cardx = list[0][i].getCards("h", cardxx => cardxx.cardid == cardid)[0];
+ if (cardx && get.position(cardx) == "h") {
+ cards.push(cardx);
+ list[0][i].$throw(cardx);
+ bool = true;
+ break;
+ }
+ }
+ }
+ if (!bool) cards.push(card);
+ }
+ trigger.cards = cards;
+ trigger.card.cards = cards;
+ trigger.throw = false;
+ },
+ mod: {
+ aiOrder: function (player, card, num) {
+ var list = player.storage.taoxi_list;
+ if (!list || !list[1]) return;
+ if (list[1].includes(card)) return num + 0.5;
+ },
+ cardEnabled2: function (card) {
+ if (get.itemtype(card) == "card" && card.hasGaintag("taoxi") && _status.event.name == "chooseToRespond") return false;
+ },
+ },
+ ai: {
+ effect: {
+ player_use: function (card, player, target) {
+ var list = player.storage.taoxi_list;
+ if (!list || !list[1]) return;
+ if (list[1].includes(card)) return [1, 1];
+ },
+ },
+ },
+ },
+ lose: {
+ trigger: {
+ global: ["loseEnd", "equipEnd", "addJudgeEnd", "gainEnd", "loseAsyncEnd", "addToExpansionEnd"],
+ },
+ charlotte: true,
+ forced: true,
+ popup: false,
+ firstDo: true,
+ filter: function (event, player) {
+ var list = player.storage.taoxi_list;
+ if (!list || !list[0].length) return false;
+ return game.hasPlayer(function (current) {
+ if (!list[0].includes(current)) return;
+ var evt = event.getl(current);
+ if (
+ evt &&
+ evt.hs &&
+ evt.hs.some(card => {
+ return list[1].some(i => i._cardid == card.cardid);
+ })
+ )
+ return true;
+ return false;
+ });
+ },
+ content: function () {
+ var list = player.storage.taoxi_list;
+ var targets = game.filterPlayer(function (current) {
+ if (!list[0].includes(current)) return;
+ var evt = trigger.getl(current);
+ if (
+ evt &&
+ evt.hs &&
+ evt.hs.some(card => {
+ return list[1].some(i => i._cardid == card.cardid);
+ })
+ )
+ return true;
+ return false;
+ });
+ for (var target of targets) {
+ var hs = trigger.getl(target).hs;
+ for (var i = 0; i < list[0].length; i++) {
+ if (hs.some(j => j.cardid == list[1][i]._cardid)) {
+ if (player.isOnline2()) {
+ player.send(
+ function (list, i) {
+ game.me.storage.taoxi_list = list;
+ list[1][i].delete();
+ list[0].splice(i, 1);
+ list[1].splice(i, 1);
+ },
+ player.storage.taoxi_list,
+ i
+ );
+ }
+ list[1][i].delete();
+ list[0].splice(i, 1);
+ list[1].splice(i, 1);
+ i--;
+ }
+ }
+ }
+ },
+ },
+ list: {
+ trigger: { player: "phaseEnd" },
+ charlotte: true,
+ forced: true,
+ onremove: function (player) {
+ game.broadcastAll(function (player) {
+ player.storage.taoxi_list[1].forEach(i => i.delete());
+ delete player.storage.taoxi_list;
+ }, player);
+ },
+ filter: function (event, player) {
+ return player.storage.taoxi_list && player.storage.taoxi_list[0].length > 0;
+ },
+ content: function () {
+ player.loseHp();
+ },
+ },
+ },
+ },
+ xingshuai: {
+ skillAnimation: true,
+ animationColor: "thunder",
+ audio: 2,
+ trigger: { player: "dying" },
+ //priority:6,
+ zhuSkill: true,
+ filter: function (event, player) {
+ if (player.hp > 0) return false;
+ if (!player.hasZhuSkill("xingshuai")) return false;
+ return game.hasPlayer(function (current) {
+ return current != player && current.group == "wei";
+ });
+ },
+ mark: true,
+ unique: true,
+ limited: true,
+ content: function () {
+ "step 0";
+ player.awakenSkill("xingshuai");
+ var targets = game.filterPlayer();
+ targets.remove(player);
+ event.targets = targets;
+ event.damages = [];
+ "step 1";
+ if (event.targets.length) {
+ var current = event.targets.shift();
+ if (current.group == "wei") {
+ current
+ .chooseBool("是否令" + get.translation(player) + "回复1点体力?")
+ .set("ai", function () {
+ return get.attitude(_status.event.player, _status.event.target) > 2;
+ })
+ .set("target", player);
+ event.current = current;
+ } else {
+ event.redo();
+ }
+ } else {
+ event.goto(3);
+ }
+ "step 2";
+ if (result.bool) {
+ event.damages.push(event.current);
+ event.current.line(player, "green");
+ game.log(event.current, "令", player, "回复1点体力");
+ player.recover();
+ }
+ if (event.targets.length) {
+ event.goto(1);
+ }
+ "step 3";
+ if (event.damages.length) {
+ var next = game.createEvent("xingshuaI_next");
+ event.next.remove(next);
+ trigger.after.push(next);
+ next.targets = event.damages;
+ next.setContent(function () {
+ targets.shift().damage();
+ if (targets.length) event.redo();
+ });
+ }
+ },
+ },
+ mingjian: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: function (card, player, target) {
+ return player != target;
+ },
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ filterCard: true,
+ selectCard: -1,
+ discard: false,
+ lose: false,
+ delay: false,
+ content: function () {
+ player.give(cards, target);
+ target.addTempSkill("mingjian2", { player: "phaseAfter" });
+ target.storage.mingjian2++;
+ target.updateMarks("mingjian2");
+ },
+ ai: {
+ order: 1,
+ result: {
+ target: function (player, target) {
+ if (target.hasSkillTag("nogain")) return 0;
+ if (player.countCards("h") == player.countCards("h", "du")) return -1;
+ if (target.hasJudge("lebu")) return 0;
+ if (get.attitude(player, target) > 3) {
+ var basis = get.threaten(target);
+ if (
+ player == get.zhu(player) &&
+ player.hp <= 2 &&
+ player.countCards("h", "shan") &&
+ !game.hasPlayer(function (current) {
+ return get.attitude(current, player) > 3 && current.countCards("h", "tao") > 0;
+ })
+ )
+ return 0;
+ if (target.countCards("h") + player.countCards("h") > target.hp + 2) return basis * 0.8;
+ return basis;
+ }
+ return 0;
+ },
+ },
+ },
+ },
+ mingjian2: {
+ charlotte: true,
+ mark: true,
+ intro: {
+ content: "手牌上限+#,出杀次数+#",
+ },
+ init: function (player, skill) {
+ if (!player.storage[skill]) player.storage[skill] = 0;
+ },
+ onremove: true,
+ mod: {
+ maxHandcard: function (player, num) {
+ return num + player.storage.mingjian2;
+ },
+ cardUsable: function (card, player, num) {
+ if (card.name == "sha") return num + player.storage.mingjian2;
+ },
+ },
+ },
+ mingjian_old: {
+ audio: 2,
+ trigger: { player: "phaseUseBefore" },
+ direct: true,
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ content: function () {
+ "step 0";
+ var go = Math.random() < 0.5;
+ player.chooseTarget(get.prompt("mingjian_old"), function (card, player, target) {
+ return player != target;
+ }).ai = function (target) {
+ var att = get.attitude(player, target);
+ if (att > 3) {
+ if (player.countCards("h") > player.hp) return att;
+ if (go) return att;
+ }
+ return 0;
+ };
+ "step 1";
+ if (result.bool) {
+ player.logSkill("mingjian_old", result.targets);
+ trigger.cancel();
+ var target = result.targets[0];
+ target.addSkill("mingjian2_old");
+ var hs = player.getCards("h");
+ player.give(hs, target);
+ }
+ },
+ },
+ mingjian2_old: {
+ audio: false,
+ trigger: { global: "phaseAfter" },
+ forced: true,
+ popup: false,
+ charlotte: true,
+ content: function () {
+ if (lib.config.glow_phase) {
+ if (_status.currentPhase) {
+ _status.currentPhase.classList.remove("glow_phase");
+ }
+ player.classList.add("glow_phase");
+ }
+ game.addVideo("phaseChange", player);
+ _status.currentPhase = player;
+ player.ai.tempIgnore = [];
+ player.stat.push({ card: {}, skill: {} });
+ player.phaseUse();
+ player.removeSkill("mingjian2_old");
+ },
+ },
+ huituo: {
+ audio: 2,
+ audioname: ["re_caorui"],
+ trigger: { player: "damageEnd" },
+ direct: true,
+ content: function () {
+ "step 0";
+ var forced = event.forced === undefined ? false : event.forced;
+ var info = get.skillInfoTranslation("huituo", player);
+ var str = `###${forced ? "恢拓:请选择一名角色" : get.prompt("huituo")}###令一名角色判定。若结果为红色,其回复1点体力;若结果为黑色,其摸${get.cnNumber(trigger.num)}张牌`;
+ player.chooseTarget(str, event.forced).set("ai", function (target) {
+ var player = _status.event.player;
+ if (get.attitude(player, target) > 0) {
+ return get.recoverEffect(target, player, player) + 1;
+ }
+ return 0;
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("huituo", result.targets);
+ var target = result.targets[0];
+ event.target = target;
+ target.judge(function (card) {
+ if (target.hp == target.maxHp) {
+ if (get.color(card) == "red") return -1;
+ }
+ if (get.color(card) == "red") return 1;
+ return 0;
+ });
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.color) {
+ if (result.color == "red") {
+ if (event.target.hp < event.target.maxHp) event.target.recover();
+ } else {
+ event.target.draw(trigger.num);
+ }
+ }
+ },
+ ai: {
+ maixie: true,
+ maixie_hp: true,
+ },
+ },
+ duodao: {
+ trigger: { player: "damageEnd" },
+ filter: function (event, player) {
+ return player.countCards("he") > 0 && event.source && event.card && event.card.name == "sha";
+ },
+ direct: true,
+ //priority:5,
+ audio: 2,
+ content: function () {
+ "step 0";
+ var prompt = "弃置一张牌";
+ if (trigger.source.getEquips(1).length) prompt += ",然后获得" + get.translation(trigger.source) + "装备区中的" + get.translation(trigger.source.getEquips(1));
+ var next = player.chooseToDiscard("he", get.prompt("duodao", trigger.source), prompt);
+ next.logSkill = ["duodao", trigger.source];
+ next.set("ai", function (card) {
+ if (!_status.event.getTrigger().source.getEquip(1)) return 0;
+ if (get.attitude(_status.event.player, _status.event.getTrigger().source) <= 0) {
+ return 6 - get.value(card);
+ }
+ return 0;
+ });
+ "step 1";
+ if (result.bool && trigger.source.getEquips(1).length) {
+ player.gain(trigger.source.getEquips(1), trigger.source, "give", "bySelf");
+ }
+ },
+ ai: {
+ maixie_defend: true,
+ },
+ },
+ reanjian: {
+ trigger: { player: "useCardToPlayered" },
+ forced: true,
+ audio: 2,
+ filter: function (event, player) {
+ return event.card.name == "sha" && !event.target.inRange(player);
+ },
+ logTarget: "target",
+ content: function () {
+ trigger.getParent().reanjian_buffed = true;
+ var map = trigger.customArgs;
+ var id = trigger.target.playerid;
+ if (!map[id]) map[id] = {};
+ if (!map[id].extraDamage) map[id].extraDamage = 0;
+ map[id].extraDamage++;
+ trigger.target.addTempSkill("reanjian2");
+ trigger.target.addTempSkill("reanjian4");
+ trigger.target.storage.reanjian2.add(trigger.card);
+ },
+ ai: {
+ unequip_ai: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (arg && arg.name == "sha" && arg.target && !arg.target.inRange(player)) return true;
+ return false;
+ },
+ },
+ },
+ reanjian2: {
+ firstDo: true,
+ ai: { unequip2: true },
+ init: function (player, skill) {
+ if (!player.storage[skill]) player.storage[skill] = [];
+ },
+ onremove: true,
+ trigger: {
+ player: ["damage", "damageCancelled", "damageZero"],
+ target: ["shaMiss", "useCardToExcluded"],
+ },
+ charlotte: true,
+ filter: function (event, player) {
+ return player.storage.reanjian2 && event.card && player.storage.reanjian2.includes(event.card);
+ },
+ silent: true,
+ forced: true,
+ popup: false,
+ priority: 12,
+ content: function () {
+ player.storage.reanjian2.remove(trigger.card);
+ if (!player.storage.reanjian2.length) player.removeSkill("reanjian2");
+ },
+ },
+ reanjian3: {
+ mod: {
+ cardSavable: function (card) {
+ if (card.name == "tao") return false;
+ },
+ },
+ },
+ reanjian4: {
+ trigger: { player: "dyingBegin" },
+ forced: true,
+ silent: true,
+ firstDo: true,
+ filter: function (event, player) {
+ return (event.getParent(2).reanjian_buffed = true);
+ },
+ content: function () {
+ player.addTempSkill("reanjian3", { global: ["dyingEnd", "phaseEnd"] });
+ },
+ },
+ reduodao: {
+ trigger: { target: "useCardToTargeted" },
+ filter: function (event, player) {
+ return event.card.name == "sha" && (get.color(event.card) == "red" ? event.player.getEquips(1).length > 0 : player.countCards("he") > 0);
+ },
+ direct: true,
+ audio: 2,
+ content: function () {
+ "step 0";
+ var prompt = "弃置一张牌";
+ if (trigger.player.getEquips(1).length) prompt += ",然后获得" + get.translation(trigger.player) + "装备区中的" + get.translation(trigger.player.getEquips(1));
+ var next = player.chooseToDiscard("he", get.prompt("reduodao", trigger.player), prompt);
+ next.logSkill = ["reduodao", trigger.player];
+ next.set("ai", function (card) {
+ if (!_status.event.getTrigger().player.getEquips(1).length) return 0;
+ if (get.attitude(_status.event.player, _status.event.getTrigger().player) * get.value(_status.event.getTrigger().player.getEquips(1)) <= 0) {
+ return 6 - get.value(card);
+ }
+ return 0;
+ });
+ "step 1";
+ if (result.bool && trigger.player.getEquips(1).length) {
+ if (!result.cards || !result.cards.length) player.logSkill("reduodao", trigger.player);
+ player.gain(trigger.player.getEquips(1), trigger.player, "give", "bySelf");
+ }
+ },
+ },
+ anjian: {
+ audio: 2,
+ trigger: { source: "damageBegin1" },
+ check: function (event, player) {
+ return get.attitude(player, event.player) <= 0;
+ },
+ forced: true,
+ filter: function (event, player) {
+ return event.getParent().name == "sha" && !event.player.inRange(player);
+ },
+ content: function () {
+ trigger.num++;
+ },
+ },
+ xinpojun: {
+ shaRelated: true,
+ trigger: { player: "useCardToPlayered" },
+ direct: true,
+ filter: function (event, player) {
+ return event.card.name == "sha" && player.isPhaseUsing() && event.target.hp > 0 && event.target.countCards("he") > 0;
+ },
+ audio: 2,
+ content: function () {
+ "step 0";
+ player.choosePlayerCard(trigger.target, "he", [1, Math.min(trigger.target.countCards("he"), trigger.target.hp)], get.prompt("xinpojun", trigger.target)).set("forceAuto", true);
+ "step 1";
+ if (result.bool && result.links.length) {
+ var target = trigger.target;
+ player.logSkill("xinpojun", target);
+ target.addToExpansion(result.cards, "giveAuto", target).gaintag.add("xinpojun2");
+ target.addSkill("xinpojun2");
+ }
+ },
+ ai: {
+ unequip_ai: true,
+ directHit_ai: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (get.attitude(player, arg.target) > 0 || !player.isPhaseUsing()) return false;
+ if (tag == "directHit_ai") return arg.target.hp >= Math.max(1, arg.target.countCards("h") - 1);
+ if (arg && arg.name == "sha" && arg.target.getEquip(2)) return true;
+ return false;
+ },
+ },
+ },
+ xinpojun2: {
+ trigger: { global: "phaseEnd" },
+ forced: true,
+ popup: false,
+ charlotte: true,
+ filter: function (event, player) {
+ return player.getExpansions("xinpojun2").length > 0;
+ },
+ content: function () {
+ "step 0";
+ var cards = player.getExpansions("xinpojun2");
+ player.gain(cards, "draw");
+ game.log(player, "收回了" + get.cnNumber(cards.length) + "张“破军”牌");
+ "step 1";
+ player.removeSkill("xinpojun2");
+ },
+ intro: {
+ markcount: "expansion",
+ mark: function (dialog, storage, player) {
+ var cards = player.getExpansions("xinpojun2");
+ if (player.isUnderControl(true)) dialog.addAuto(cards);
+ else return "共有" + get.cnNumber(cards.length) + "张牌";
+ },
+ },
+ },
+ qiaoshi: {
+ audio: 2,
+ trigger: { global: "phaseJieshuBegin" },
+ filter: function (event, player) {
+ return event.player != player && event.player.countCards("h") == player.countCards("h") && event.player.isIn();
+ },
+ check: function (event, player) {
+ return get.attitude(player, event.player) >= 0;
+ },
+ logTarget: "player",
+ content: function () {
+ game.asyncDraw([trigger.player, player]);
+ },
+ },
+ yanyu: {
+ audio: 2,
+ enable: "phaseUse",
+ filter: function (event, player) {
+ return player.hasCard(card => lib.skill.yanyu.filterCard(card, player), "h");
+ },
+ filterCard: (card, player) => get.name(card) == "sha" && player.canRecast(card),
+ discard: false,
+ lose: false,
+ delay: false,
+ content: function () {
+ player.recast(cards);
+ },
+ ai: {
+ basic: {
+ order: 1,
+ },
+ result: {
+ player: 1,
+ },
+ },
+ group: "yanyu2",
+ },
+ yanyu2: {
+ trigger: { player: "phaseUseEnd" },
+ filter: function (event, player) {
+ return (
+ player.getHistory("useSkill", function (evt) {
+ return evt.event.getParent("phaseUse") == event && evt.skill == "yanyu";
+ }).length >= 2
+ );
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("yanyu"), "令一名男性角色摸两张牌", function (card, player, target) {
+ return target.hasSex("male") && target != player;
+ })
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("yanyu", result.targets);
+ result.targets[0].draw(2);
+ }
+ },
+ },
+ youdi: {
+ audio: 2,
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ filter: function (event, player) {
+ return player.countCards("he") > 0;
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("youdi"), function (card, player, target) {
+ return player != target;
+ })
+ .set("ai", function (target) {
+ if (!_status.event.goon) return 0;
+ if (target.countCards("he") == 0) return 0;
+ return -get.attitude(_status.event.player, target);
+ })
+ .set("goon", player.countCards("h", "sha") <= player.countCards("h") / 3);
+ "step 1";
+ if (result.bool) {
+ game.delay();
+ player.logSkill("youdi", result.targets);
+ event.target = result.targets[0];
+ event.target.discardPlayerCard(player, "he", true);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.links[0].name != "sha" && event.target.countGainableCards(player, "he")) {
+ player.gainPlayerCard("he", event.target, true);
+ }
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ fuhun: {
+ enable: ["chooseToUse", "chooseToRespond"],
+ filterCard: true,
+ selectCard: 2,
+ position: "hs",
+ audio: 2,
+ audioname: ["re_guanzhang"],
+ derivation: ["new_rewusheng", "olpaoxiao"],
+ viewAs: { name: "sha" },
+ prompt: "将两张手牌当杀使用或打出",
+ viewAsFilter: function (player) {
+ return player.countCards("hs") > 1;
+ },
+ check: function (card) {
+ if (_status.event.player.hasSkill("new_rewusheng") && get.color(card) == "red") return 0;
+ if (_status.event.name == "chooseToRespond") {
+ if (card.name == "sha") return 0;
+ return 6 - get.useful(card);
+ }
+ if (_status.event.player.countCards("hs") < 4) return 6 - get.useful(card);
+ return 7 - get.useful(card);
+ },
+ ai: {
+ respondSha: true,
+ skillTagFilter: function (player) {
+ if (player.countCards("hs") < 2) return false;
+ },
+ order: function (item, player) {
+ if (player.hasSkill("new_rewusheng") && player.hasSkill("olpaoxiao")) {
+ return 1;
+ }
+ if (player.countCards("hs") < 4) {
+ return 1;
+ }
+ return 4;
+ },
+ },
+ group: "fuhun2",
+ },
+ fuhun2: {
+ audio: "fuhun",
+ audioname: ["re_guanzhang"],
+ trigger: { source: "damageSource" },
+ forced: true,
+ filter: function (event, player) {
+ if (["new_rewusheng", "olpaoxiao"].every(skill => player.hasSkill(skill, null, false, false))) return false;
+ return event.getParent().skill == "fuhun";
+ },
+ content: function () {
+ player.addTempSkills(["new_rewusheng", "olpaoxiao"]);
+ // player.addTempSkill('fuhun3');
+ },
+ },
+ fuhun3: {},
+ fencheng: {
+ skillAnimation: "epic",
+ animationColor: "gray",
+ audio: 2,
+ enable: "phaseUse",
+ filter: function (event, player) {
+ return !player.storage.fencheng;
+ },
+ filterTarget: function (card, player, target) {
+ return player != target;
+ },
+ unique: true,
+ limited: true,
+ selectTarget: -1,
+ mark: true,
+ line: "fire",
+ content: function () {
+ "step 0";
+ player.storage.fencheng = true;
+ player.awakenSkill("fencheng");
+ var res = get.damageEffect(target, player, target, "fire");
+ var num = Math.max(1, target.countCards("e"));
+ target
+ .chooseToDiscard(num, "he", "弃置" + get.cnNumber(num) + "张牌或受到1点火焰伤害")
+ .set("ai", function (card) {
+ var res = _status.event.res;
+ var num = _status.event.num;
+ var player = _status.event.player;
+ if (res >= 0) return -1;
+ if (num > 2 && player.hp > 1) return -1;
+ if (num > 1 && player.hp > 2) return -1;
+ if (get.position(card) == "e") {
+ return 10 - get.value(card);
+ }
+ return 6 - get.value(card);
+ })
+ .set("res", res)
+ .set("num", num);
+ "step 1";
+ if (!result.bool) {
+ target.damage("fire");
+ }
+ },
+ ai: {
+ order: 1,
+ result: {
+ player: function (player) {
+ var num = 0,
+ players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (player != players[i] && get.damageEffect(players[i], player, players[i], "fire") < 0) {
+ var att = get.attitude(player, players[i]);
+ if (att > 0) {
+ num -= Math.max(1, players[i].countCards("e"));
+ } else if (att < 0) {
+ num += Math.max(1, players[i].countCards("e"));
+ }
+ }
+ }
+ if (players.length < 5) {
+ return num - 1;
+ } else {
+ return num - 2;
+ }
+ },
+ },
+ },
+ init: function (player) {
+ player.storage.fencheng = false;
+ },
+ intro: {
+ content: "limited",
+ },
+ },
+ mieji: {
+ trigger: { player: "useCard2" },
+ direct: true,
+ audio: 2,
+ filter: function (event, player) {
+ if (get.type(event.card) != "trick" || get.color(event.card) != "black") return false;
+ if (!event.targets || event.targets.length != 1) return false;
+ var info = get.info(event.card);
+ if (info.allowMultiple == false) return false;
+ if (event.targets && !info.multitarget) {
+ if (
+ game.hasPlayer(function (current) {
+ return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current);
+ })
+ ) {
+ return true;
+ }
+ }
+ return false;
+ },
+ position: "he",
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("mieji"), "为" + get.translation(trigger.card) + "增加一个额外目标", function (card, player, target) {
+ var player = _status.event.player;
+ if (_status.event.targets.includes(target)) return false;
+ return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target);
+ })
+ .set("autodelay", true)
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ return get.effect(target, trigger.card, player, player);
+ })
+ .set("targets", trigger.targets)
+ .set("card", trigger.card);
+ "step 1";
+ if (result.bool) {
+ player.logSkill("mieji", result.targets);
+ trigger.targets.push(result.targets[0]);
+ }
+ },
+ },
+ junxing: {
+ enable: "phaseUse",
+ audio: 2,
+ usable: 1,
+ filterCard: true,
+ selectCard: [1, Infinity],
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ check: function (card) {
+ if (ui.selected.cards.length) return -1;
+ var val = get.value(card);
+ if (get.type(card) == "basic") return 8 - get.value(card);
+ return 5 - get.value(card);
+ },
+ filterTarget: function (card, player, target) {
+ return player != target;
+ },
+ content: function () {
+ "step 0";
+ var types = [];
+ for (var i = 0; i < cards.length; i++) {
+ types.add(get.type(cards[i], "trick", player));
+ }
+ target
+ .chooseToDiscard(function (card) {
+ return !_status.event.types.includes(get.type(card, "trick"));
+ })
+ .set("ai", function (card) {
+ if (_status.event.player.isTurnedOver()) return -1;
+ return 8 - get.value(card);
+ })
+ .set("types", types)
+ .set("dialog", ["弃置一张与" + get.translation(player) + "弃置的牌类别均不同的牌,或将武将牌翻面", "hidden", cards]);
+ "step 1";
+ if (!result.bool) {
+ target.turnOver();
+ target.draw(cards.length);
+ }
+ },
+ ai: {
+ order: 2,
+ expose: 0.3,
+ threaten: 1.8,
+ result: {
+ target: function (player, target) {
+ if (target.hasSkillTag("noturn")) return 0;
+ if (target.isTurnedOver()) return 2;
+ return -1 / (target.countCards("h") + 1);
+ },
+ },
+ },
+ },
+ juece: {
+ audio: 2,
+ trigger: {
+ global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ direct: true,
+ filter: function (event, player) {
+ if (_status.currentPhase != player) return false;
+ return game.hasPlayer(current => {
+ if (current == player || current.countCards("h")) return false;
+ var evt = event.getl(current);
+ return evt && evt.hs && evt.hs.length;
+ });
+ },
+ check: function (event, player) {
+ return get.damageEffect(event.player, player, player) > 0;
+ },
+ content: function () {
+ "step 0";
+ var targets = game.filterPlayer(current => {
+ if (current == player || current.countCards("h")) return false;
+ var evt = trigger.getl(current);
+ return evt && evt.hs && evt.hs.length;
+ });
+ event.targets = targets;
+ "step 1";
+ var target = event.targets.shift();
+ event.target = target;
+ player.chooseBool(get.prompt2("juece", target)).set("ai", () => {
+ return get.damageEffect(_status.event.getParent().target, _status.event.player, _status.event.player) >= 0;
+ });
+ "step 2";
+ if (result.bool) {
+ player.logSkill("juece", target);
+ target.damage();
+ }
+ "step 3";
+ if (targets.length) event.goto(1);
+ },
+ ai: {
+ threaten: 1.1,
+ },
+ },
+ jiefan: {
+ skillAnimation: true,
+ animationColor: "wood",
+ audio: 2,
+ audioname: ["re_handang"],
+ unique: true,
+ limited: true,
+ mark: true,
+ init: function (player) {
+ player.storage.jiefan = false;
+ },
+ enable: "phaseUse",
+ filter: function (event, player) {
+ return !player.storage.jiefan;
+ },
+ intro: {
+ content: "limited",
+ },
+ filterTarget: true,
+ content: function () {
+ "step 0";
+ player.awakenSkill("jiefan");
+ player.storage.jiefan = true;
+ event.players = game.filterPlayer(function (current) {
+ return current != target && current.inRange(target);
+ });
+ event.players.sortBySeat(target);
+ "step 1";
+ if (event.players.length) {
+ event.current = event.players.shift();
+ event.current.addTempClass("target");
+ player.line(event.current, "green");
+ if (event.current.countCards("he") && target.isIn()) {
+ event.current
+ .chooseToDiscard({ subtype: "equip1" }, "he", "弃置一张武器牌或让" + get.translation(target) + "摸一张牌")
+ .set("ai", function (card) {
+ if (get.attitude(_status.event.player, _status.event.target) < 0) return 7 - get.value(card);
+ return -1;
+ })
+ .set("target", target);
+ event.tempbool = false;
+ } else {
+ event.tempbool = true;
+ }
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (event.tempbool || result.bool == false) {
+ target.draw();
+ }
+ event.goto(1);
+ },
+ ai: {
+ order: 5,
+ result: {
+ target: function (player, target) {
+ if (player.hp > 2) {
+ if (game.phaseNumber < game.players.length * 2) return 0;
+ }
+ var num = 0,
+ players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (players[i] != target && players[i].inRange(target)) {
+ num++;
+ }
+ }
+ return num;
+ },
+ },
+ },
+ },
+ fuli: {
+ skillAnimation: true,
+ animationColor: "soil",
+ audio: 2,
+ unique: true,
+ limited: true,
+ enable: "chooseToUse",
+ init: function (player) {
+ player.storage.fuli = false;
+ },
+ mark: true,
+ filter: function (event, player) {
+ if (event.type != "dying") return false;
+ if (player != event.dying) return false;
+ if (player.storage.fuli) return false;
+ return true;
+ },
+ content: function () {
+ "step 0";
+ player.awakenSkill("fuli");
+ player.recover(game.countGroup() - player.hp);
+ "step 1";
+ player.turnOver();
+ player.storage.fuli = true;
+ },
+ ai: {
+ save: true,
+ skillTagFilter: function (player, arg, target) {
+ return player == target && player.storage.fuli != true;
+ },
+ result: {
+ player: 10,
+ },
+ threaten: function (player, target) {
+ if (!target.storage.fuli) return 0.9;
+ },
+ },
+ intro: {
+ content: "limited",
+ },
+ },
+ qianxi: {
+ audio: 2,
+ trigger: { player: "phaseZhunbeiBegin" },
+ preHidden: true,
+ content: function () {
+ "step 0";
+ player.draw();
+ player.chooseToDiscard("he", true);
+ "step 1";
+ if (!result.bool) {
+ event.finish();
+ return;
+ }
+ event.color = get.color(result.cards[0], result.cards[0].original == "h" ? player : false);
+ player
+ .chooseTarget(function (card, player, target) {
+ return player != target && get.distance(player, target) <= 1;
+ }, true)
+ .set("ai", function (target) {
+ return -get.attitude(_status.event.player, target);
+ });
+ "step 2";
+ if (result.bool && result.targets.length) {
+ result.targets[0].storage.qianxi2 = event.color;
+ result.targets[0].addTempSkill("qianxi2");
+ player.line(result.targets, "green");
+ game.addVideo("storage", result.targets[0], ["qianxi2", event.color]);
+ }
+ },
+ ai: {
+ directHit_ai: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (tag !== "directHit_ai" || !arg.target.hasSkill("qianxi2")) return false;
+ if (arg.card.name == "sha")
+ return (
+ arg.target.storage.qianxi2 == "red" &&
+ (!arg.target.hasSkillTag(
+ "freeShan",
+ false,
+ {
+ player: player,
+ card: arg.card,
+ },
+ true
+ ) ||
+ player.hasSkillTag("unequip", false, {
+ name: arg.card ? arg.card.name : null,
+ target: arg.target,
+ card: arg.card,
+ }) ||
+ player.hasSkillTag("unequip_ai", false, {
+ name: arg.card ? arg.card.name : null,
+ target: arg.target,
+ card: arg.card,
+ }))
+ );
+ return arg.target.storage.qianxi2 == "black";
+ },
+ },
+ },
+ qianxi2: {
+ //trigger:{global:'phaseAfter'},
+ forced: true,
+ mark: true,
+ audio: false,
+ content: function () {
+ player.removeSkill("qianxi2");
+ delete player.storage.qianxi2;
+ },
+ mod: {
+ cardEnabled2: function (card, player) {
+ if (get.color(card) == player.storage.qianxi2 && get.position(card) == "h") return false;
+ },
+ },
+ intro: {
+ content: function (color) {
+ return "不能使用或打出" + get.translation(color) + "的手牌";
+ },
+ },
+ },
+ zhiman: {
+ audio: 2,
+ audioname: ["guansuo"],
+ trigger: { source: "damageBegin2" },
+ check: function (event, player) {
+ if (get.damageEffect(event.player, player, player) < 0) return true;
+ var att = get.attitude(player, event.player);
+ if (att > 0 && event.player.countCards("j")) return true;
+ if (event.num > 1) {
+ if (att < 0) return false;
+ if (att > 0) return true;
+ }
+ var cards = event.player.getGainableCards(player, "e");
+ for (var i = 0; i < cards.length; i++) {
+ if (get.equipValue(cards[i]) >= 6) return true;
+ }
+ return false;
+ },
+ filter: function (event, player) {
+ return player != event.player;
+ },
+ logTarget: "player",
+ content: function () {
+ if (trigger.player.countGainableCards(player, "ej")) {
+ player.gainPlayerCard(trigger.player, "ej", true);
+ }
+ trigger.cancel();
+ },
+ },
+ sanyao: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: function (card, player, target) {
+ return target.isMaxHp();
+ },
+ filter: function (event, player) {
+ return player.countCards("he") > 0;
+ },
+ check: function (card) {
+ return 7 - get.value(card);
+ },
+ position: "he",
+ filterCard: true,
+ content: function () {
+ target.damage("nocard");
+ },
+ ai: {
+ result: {
+ target: function (player, target) {
+ if (target.countCards("j") && get.attitude(player, target) > 0) {
+ return 1;
+ }
+ if (target.countCards("e")) {
+ return -1;
+ }
+ return get.damageEffect(target, player);
+ },
+ },
+ order: 7,
+ },
+ },
+ olsanyao: {
+ enable: "phaseUse",
+ audio: "sanyao",
+ filter: function (event, player) {
+ return player.countCards("he") > 0 && (!player.hasSkill("olsanyao0") || !player.hasSkill("olsanyao1"));
+ },
+ chooseButton: {
+ dialog: function (event, player) {
+ var list = ["选择手牌数最多的一名角色", "选择体力值最大的一名角色"];
+ var choiceList = ui.create.dialog("散谣:请选择一项", "forcebutton", "hidden");
+ choiceList.add([
+ list.map((item, i) => {
+ return [i, item];
+ }),
+ "textbutton",
+ ]);
+ return choiceList;
+ },
+ filter: function (button, player) {
+ return !player.hasSkill("olsanyao" + button.link);
+ },
+ check: function (button) {
+ var player = _status.event.player;
+ if (
+ game.hasPlayer(
+ [
+ function (target) {
+ var num = target.countCards("h");
+ return (
+ !game.hasPlayer(function (current) {
+ return current != target && current.countCards("h") > num;
+ }) && get.effect(target, "sanyao", player, player) > 0
+ );
+ },
+ function (target) {
+ var num = target.hp;
+ return (
+ !game.hasPlayer(function (current) {
+ return current != target && current.hp > num;
+ }) && get.effect(target, "sanyao", player, player) > 0
+ );
+ },
+ ][button.link]
+ )
+ )
+ return 1 + button.link;
+ return 0;
+ },
+ backup: function (links) {
+ return {
+ audio: "sanyao",
+ filterTarget: [
+ function (card, player, target) {
+ var num = target.countCards("h");
+ return !game.hasPlayer(function (current) {
+ return current != target && current.countCards("h") > num;
+ });
+ },
+ function (card, player, target) {
+ return !game.hasPlayer(function (current) {
+ return current != target && current.hp > target.hp;
+ });
+ },
+ ][links[0]],
+ index: links[0],
+ filterCard: true,
+ check: function (card) {
+ return 7 - get.value(card);
+ },
+ position: "he",
+ content: function () {
+ player.addTempSkill("olsanyao" + lib.skill[event.name].index);
+ target.damage("nocard");
+ },
+ ai: lib.skill.sanyao.ai,
+ };
+ },
+ prompt: function () {
+ return "请选择【散谣】的目标";
+ },
+ },
+ ai: {
+ order: 7,
+ result: {
+ player: 1,
+ },
+ },
+ },
+ olsanyao0: {},
+ olsanyao1: {},
+ rezhiman: {
+ audio: "zhiman",
+ audioname: ["guansuo", "re_masu"],
+ audioname2: {
+ dc_guansuo: "zhiman_guansuo",
+ },
+ trigger: { source: "damageBegin2" },
+ filter: function (event, player) {
+ return player != event.player;
+ },
+ check: function (event, player) {
+ if (get.damageEffect(event.player, player, player) < 0) return true;
+ var att = get.attitude(player, event.player);
+ if (att > 0 && event.player.countCards("j")) return true;
+ if (event.num > 1) {
+ if (att < 0) return false;
+ if (att > 0) return true;
+ }
+ var cards = event.player.getGainableCards(player, "he");
+ for (var i = 0; i < cards.length; i++) {
+ if (get.equipValue(cards[i]) >= 6) return true;
+ }
+ return false;
+ },
+ logTarget: "player",
+ content: function () {
+ if (trigger.player.countGainableCards(player, "hej")) {
+ player.gainPlayerCard(trigger.player, "hej", true);
+ }
+ trigger.cancel();
+ },
+ },
+ zhiman_guansuo: { audio: 2 },
+ resanyao: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ selectCard: function () {
+ var player = _status.event.player;
+ return [
+ Math.max(1, ui.selected.targets.length),
+ game.countPlayer(function (target) {
+ return (
+ target != player &&
+ !game.hasPlayer(function (current) {
+ return current != player && current.hp > target.hp;
+ })
+ );
+ }),
+ ];
+ },
+ selectTarget: function () {
+ return ui.selected.cards.length;
+ },
+ filterTarget: function (card, player, target) {
+ return (
+ target != player &&
+ !game.hasPlayer(function (current) {
+ return current != player && current.hp > target.hp;
+ })
+ );
+ },
+ check: function (card) {
+ var player = _status.event.player;
+ if (
+ game.countPlayer(function (target) {
+ return (
+ target != player &&
+ !game.hasPlayer(function (current) {
+ return current != player && current.hp > target.hp;
+ }) &&
+ get.effect(target, "sanyao", player, player) > 0
+ );
+ }) <= ui.selected.cards.length
+ )
+ return 0;
+ return 7 - get.value(card);
+ },
+ position: "he",
+ filterCard: true,
+ content: function () {
+ target.damage("nocard");
+ },
+ ai: {
+ result: {
+ target: function (player, target) {
+ var disbool = false;
+ if (player.hasSkill("rezhiman")) {
+ if (target.countCards("j") && get.attitude(player, target) > 0) {
+ return 1;
+ }
+ if (
+ target.countCards("he", function (card) {
+ return card.name == "tengjia" || get.value(card) > 0;
+ })
+ ) {
+ disbool = true;
+ }
+ }
+ var damage = get.damageEffect(target, player);
+ if (disbool && get.attitude(player, target) < 0) return Math.min(-1, damage);
+ return damage;
+ },
+ },
+ order: 7,
+ },
+ },
+ reqiaoshui: {
+ audio: 2,
+ enable: "phaseUse",
+ filterTarget: function (card, player, target) {
+ return player.canCompare(target);
+ },
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ content: function () {
+ "step 0";
+ player.chooseToCompare(target);
+ "step 1";
+ if (result.bool) player.addTempSkill("qiaoshui3", "phaseUseEnd");
+ else {
+ player.addTempSkill("qiaoshui4");
+ event.getParent(3).skipped = true;
+ }
+ },
+ ai: {
+ order: function (item, player) {
+ if (
+ player.countCards("h", function (card) {
+ return player.hasValueTarget(card);
+ })
+ )
+ return 10;
+ return 1;
+ },
+ result: {
+ target: function (player, target) {
+ if (
+ player.countCards("h", function (card) {
+ return player.hasValueTarget(card);
+ })
+ ) {
+ if (player.hasSkill("qiaoshui3")) return 0;
+ var nd = !player.needsToDiscard();
+ if (
+ player.hasCard(function (card) {
+ if (get.position(card) != "h") return false;
+ var val = get.value(card);
+ if (nd && val < 0) return true;
+ if (val <= 5) {
+ return get.number(card) >= 12;
+ }
+ if (val <= 6) {
+ return get.number(card) >= 13;
+ }
+ return false;
+ })
+ )
+ return -1;
+ return 0;
+ }
+ return -1;
+ },
+ },
+ },
+ },
+ qiaoshui: {
+ audio: 2,
+ audioname2: {
+ re_jianyong: "reqiaoshui",
+ xin_jianyong: "xinqiaoshui",
+ },
+ trigger: { player: "phaseUseBegin" },
+ direct: true,
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("qiaoshui"), function (card, player, target) {
+ return player.canCompare(target);
+ })
+ .set("ai", function (target) {
+ return -get.attitude(_status.event.player, target) / target.countCards("h");
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("qiaoshui", result.targets[0]);
+ player.chooseToCompare(result.targets[0]);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool) {
+ player.addTempSkill("qiaoshui3");
+ } else {
+ player.addTempSkill("qiaoshui2");
+ }
+ },
+ ai: {
+ expose: 0.1,
+ },
+ },
+ qiaoshui2: {
+ mod: {
+ cardEnabled: function (card) {
+ if (get.type(card, "trick") == "trick") return false;
+ },
+ },
+ },
+ qiaoshui3: {
+ charlotte: true,
+ audio: "qiaoshui",
+ audioname2: {
+ re_jianyong: "reqiaoshui",
+ xin_jianyong: "xinqiaoshui",
+ ol_jianyong: "olqiaoshui",
+ },
+ trigger: { player: "useCard2" },
+ filter: function (event, player) {
+ var type = get.type(event.card);
+ return type == "basic" || type == "trick";
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player.removeSkill("qiaoshui3");
+ var goon = false;
+ var info = get.info(trigger.card);
+ if (trigger.targets && !info.multitarget) {
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (lib.filter.targetEnabled2(trigger.card, player, players[i]) && !trigger.targets.includes(players[i])) {
+ goon = true;
+ break;
+ }
+ }
+ }
+ if (goon) {
+ player
+ .chooseTarget("巧说:是否额外指定一名" + get.translation(trigger.card) + "的目标?", function (card, player, target) {
+ var trigger = _status.event;
+ if (trigger.targets.includes(target)) return false;
+ return lib.filter.targetEnabled2(trigger.card, _status.event.player, target);
+ })
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ return get.effect(target, trigger.card, player, player);
+ })
+ .set("targets", trigger.targets)
+ .set("card", trigger.card);
+ } else {
+ if (!info.multitarget && trigger.targets && trigger.targets.length > 1) {
+ event.goto(3);
+ }
+ }
+ "step 1";
+ if (result.bool) {
+ if (!event.isMine()) game.delayx();
+ event.target = result.targets[0];
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (event.target) {
+ player.logSkill("qiaoshui3", event.target);
+ trigger.targets.add(event.target);
+ }
+ event.finish();
+ "step 3";
+ player
+ .chooseTarget("巧说:是否减少一名" + get.translation(trigger.card) + "的目标?", function (card, player, target) {
+ return _status.event.targets.includes(target);
+ })
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ return -get.effect(target, trigger.card, trigger.player, _status.event.player);
+ })
+ .set("targets", trigger.targets);
+ "step 4";
+ if (result.bool) {
+ event.targets = result.targets;
+ if (event.isMine()) {
+ player.logSkill("qiaoshui3", event.targets);
+ event.finish();
+ }
+ for (var i = 0; i < result.targets.length; i++) {
+ trigger.targets.remove(result.targets[i]);
+ }
+ game.delay();
+ } else {
+ event.finish();
+ }
+ "step 5";
+ player.logSkill("qiaoshui3", event.targets);
+ },
+ },
+ qiaoshui4: {
+ mod: {
+ ignoredHandcard: function (card, player) {
+ if (get.type(card, "trick", player) == "trick") {
+ return true;
+ }
+ },
+ cardDiscardable: function (card, player, name) {
+ if (name == "phaseDiscard" && get.type(card, "trick", player) == "trick") {
+ return false;
+ }
+ },
+ },
+ },
+ jyzongshi_old: {
+ audio: 2,
+ trigger: { target: "useCardToBegin" },
+ filter: function (event, player) {
+ if (event.targets && event.targets.length > 1) return false;
+ return event.card && get.type(event.card) == "trick" && event.player != player;
+ },
+ frequent: true,
+ content: function () {
+ player.draw();
+ },
+ ai: {
+ effect: function (card, player, target) {
+ if (get.type(card) == "trick") return [1, 1];
+ },
+ },
+ },
+ shenxing: {
+ audio: 2,
+ enable: "phaseUse",
+ position: "he",
+ filterCard: true,
+ selectCard: 2,
+ prompt: "弃置两张牌并摸一张牌",
+ check: function (card) {
+ var player = _status.event.player;
+ if (!player.hasSkill("olbingyi") || player.hasSkill("olbingyi_blocker", null, null, false)) return 4 - get.value(card);
+ var red = 0,
+ black = 0,
+ hs = player.getCards("h");
+ for (var i of hs) {
+ if (ui.selected.cards.includes(i)) continue;
+ var color = get.color(i, player);
+ if (color == "red") red++;
+ if (color == "black") black++;
+ }
+ if (red > 2 && black > 2) return 4 - get.value(card);
+ if (red == 0 || black == 0) return 8 - get.value(card);
+ var color = get.color(card);
+ if (black <= red) return (color == "black" && get.position(card) == "h" ? 8 : 4) - get.value(card);
+ return (color == "red" && get.position(card) == "h" ? 8 : 4) - get.value(card);
+ },
+ content: function () {
+ player.draw();
+ },
+ ai: {
+ order: 9,
+ result: {
+ player: function (player, target) {
+ if (!ui.selected.cards.length) return 1;
+ if (!player.hasSkill("olbingyi") || player.hasSkill("olbingyi_blocker", null, null, false)) return 1;
+ var red = 0,
+ black = 0,
+ hs = player.getCards("h");
+ for (var i of hs) {
+ if (ui.selected.cards.includes(i)) continue;
+ var color = get.color(i);
+ if (color == "red") red++;
+ if (color == "black") black++;
+ }
+ var val = 0;
+ for (var i of ui.selected.cards) val += get.value(i, player);
+ if (red == 0 || black == 0) {
+ if (red + black == 0) return 0;
+ var num =
+ Math.min(
+ red + black,
+ game.countPlayer(function (current) {
+ return current != player && get.attitude(player, current) > 0 && !current.hasSkillTag("nogain");
+ })
+ ) + 1;
+ if (num * 7 > val) return 1;
+ }
+ if (val < 8) return 1;
+ return 0;
+ },
+ },
+ },
+ },
+ bingyi: {
+ audio: 2,
+ audioname: ["xin_guyong"],
+ trigger: { player: "phaseJieshuBegin" },
+ filter: function (event, player) {
+ return player.countCards("h") > 0;
+ },
+ filterx: function (event, player) {
+ var cards = player.getCards("h");
+ if (cards.length < 1) return false;
+ var color = get.color(cards[0]);
+ for (var i = 1; i < cards.length; i++) {
+ if (get.color(cards[i]) != color) return false;
+ }
+ return true;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ if (lib.skill.bingyi.filterx(trigger, player)) {
+ player
+ .chooseTarget(get.prompt("bingyi"), "展示所有手牌,并令至多" + get.cnNumber(player.countCards("h")) + "名角色各摸一张牌", [1, player.countCards("h")], function (card, player, target) {
+ return true;
+ })
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ });
+ } else
+ player.chooseBool(get.prompt("bingyi"), "展示所有手牌").ai = function () {
+ return false;
+ };
+ "step 1";
+ if (result.bool) {
+ player.logSkill("bingyi");
+ player.showHandcards(get.translation(player) + "发动了【秉壹】");
+ event.targets = result.targets;
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (targets && targets.length) {
+ player.line(targets, "green");
+ targets.sortBySeat();
+ game.asyncDraw(targets);
+ }
+ },
+ ai: {
+ expose: 0.1,
+ },
+ },
+ xiantu: {
+ //unique:true,
+ audio: "xiantu1",
+ group: "xiantu2",
+ //gainable:true,
+ //forceunique:true,
+ trigger: { global: "phaseUseBegin" },
+ filter: function (event, player) {
+ return event.player != player;
+ },
+ logTarget: "player",
+ check: function (event, player) {
+ if (get.attitude(player, event.player) < 5) return false;
+ if (player.maxHp - player.hp >= 2) return false;
+ if (player.hp == 1) return false;
+ if (player.hp == 2 && player.countCards("h") < 2) return false;
+ if (event.player.countCards("h") >= event.player.hp) return false;
+ return true;
+ },
+ content: function () {
+ "step 0";
+ if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2);
+ player.draw(2);
+ "step 1";
+ player.chooseCard(2, "he", true, "交给" + get.translation(trigger.player) + "两张牌").set("ai", function (card) {
+ if (ui.selected.cards.length && card.name == ui.selected.cards[0].name) return -1;
+ if (get.tag(card, "damage")) return 1;
+ if (get.type(card) == "equip") return 1;
+ return 0;
+ });
+ "step 2";
+ player.give(result.cards, trigger.player);
+ trigger.player.addSkill("xiantu4");
+ trigger.player.storage.xiantu4.push(player);
+ },
+ ai: {
+ threaten: 1.1,
+ },
+ },
+ xiantu1: { audio: true },
+ xiantu2: { audio: true },
+ xiantu4: {
+ trigger: { player: "phaseUseEnd" },
+ forced: true,
+ audio: false,
+ onremove: true,
+ init: function (player, skill) {
+ if (!player.storage[skill]) player.storage[skill] = [];
+ },
+ charlotte: true,
+ content: function () {
+ while (player.storage.xiantu4.length) {
+ var current = player.storage.xiantu4.shift();
+ if (current.isDead()) continue;
+ current.logSkill("xiantu2");
+ current.loseHp();
+ }
+ player.removeSkill("xiantu4");
+ },
+ group: "xiantu3",
+ },
+ xiantu3: {
+ trigger: { source: "dieAfter" },
+ forced: true,
+ audio: false,
+ content: function () {
+ player.removeSkill("xiantu4");
+ },
+ },
+ qiangzhi: {
+ audio: 2,
+ audioname: ["re_zhangsong"],
+ trigger: { player: "phaseUseBegin" },
+ direct: true,
+ filter: function (event, player) {
+ return game.hasPlayer(function (current) {
+ return current != player && current.countCards("h") > 0;
+ });
+ },
+ subfrequent: ["draw"],
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("qiangzhi"), function (card, player, target) {
+ return target != player && target.countCards("h") > 0;
+ })
+ .set("ai", function () {
+ return Math.random();
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ event.target = target;
+ player.logSkill("qiangzhi", target);
+ player.choosePlayerCard(target, "h", true);
+ } else event.finish();
+ "step 2";
+ var card = result.cards[0];
+ target.showCards(card, get.translation(target) + "因【强识】展示");
+ player.storage.qiangzhi_draw = get.type(card, "trick");
+ game.addVideo("storage", player, ["qiangzhi_draw", player.storage.qiangzhi_draw]);
+ player.addTempSkill("qiangzhi_draw", "phaseUseEnd");
+ },
+ },
+ qiangzhi_draw: {
+ trigger: { player: "useCard" },
+ frequent: true,
+ popup: false,
+ charlotte: true,
+ prompt: "是否执行【强识】的效果摸一张牌?",
+ filter: function (event, player) {
+ return get.type(event.card, "trick") == player.storage.qiangzhi_draw;
+ },
+ content: function () {
+ player.draw();
+ },
+ onremove: true,
+ mark: true,
+ intro: {
+ content: function (type) {
+ return get.translation(type) + "牌";
+ },
+ },
+ },
+ dingpin: {
+ audio: 2,
+ enable: "phaseUse",
+ onChooseToUse: function (event) {
+ if (event.type != "phase" || game.online) return;
+ var list = [],
+ player = event.player;
+ player.getHistory("useCard", function (evt) {
+ list.add(get.type2(evt.card));
+ });
+ player.getHistory("lose", function (evt) {
+ if (evt.type != "discard") return;
+ for (var i of evt.cards2) {
+ list.add(get.type2(i, evt.hs.includes(i) ? player : false));
+ }
+ });
+ event.set("dingpin_types", list);
+ },
+ filter: function (event, player) {
+ var list = event.dingpin_types || [];
+ return (
+ player.countCards("he", function (card) {
+ return !list.includes(get.type2(card));
+ }) > 0
+ );
+ },
+ filterCard: function (card) {
+ var list = _status.event.dingpin_types || [];
+ return !list.includes(get.type2(card));
+ },
+ position: "he",
+ filterTarget: function (card, player, target) {
+ return !target.hasSkill("dingpin2");
+ },
+ content: function () {
+ "step 0";
+ target.judge(function (card) {
+ var evt = _status.event.getParent("dingpin"),
+ color = get.color(card);
+ switch (color) {
+ case "black":
+ return evt.target.getDamagedHp();
+ case "red":
+ return get.sgn(get.attitude(evt.target, evt.player)) * -3;
+ }
+ return 0;
+ }).judge2 = function (result) {
+ if (result.color == "black") return true;
+ return false;
+ };
+ "step 1";
+ switch (result.color) {
+ case "black":
+ if (target.getDamagedHp() > 0) target.draw(target.getDamagedHp());
+ target.addTempSkill("dingpin2");
+ break;
+ case "red":
+ player.turnOver();
+ break;
+ }
+ },
+ ai: {
+ order: 9,
+ result: {
+ target: function (player, target) {
+ if (player.isTurnedOver()) return target.getDamagedHp();
+ var card = ui.cardPile.firstChild;
+ if (!card) return;
+ if (get.color(card) == "black") return target.getDamagedHp();
+ return 0;
+ },
+ },
+ },
+ },
+ dingpin2: { charlotte: true },
+ faen: {
+ audio: 2,
+ trigger: { global: ["turnOverAfter", "linkAfter"] },
+ filter: function (event, player) {
+ if (event.name == "link") return event.player.isLinked();
+ return !event.player.isTurnedOver();
+ },
+ check: function (event, player) {
+ return get.attitude(player, event.player) > 0;
+ },
+ logTarget: "player",
+ content: function () {
+ trigger.player.draw();
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ jiaojin: {
+ audio: 2,
+ trigger: { player: "damageBegin3" },
+ filter: function (event, player) {
+ return player.countCards("he", { type: "equip" }) && event.source && event.source.hasSex("male");
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌令伤害-1?", function (card, player) {
+ return get.type(card) == "equip";
+ });
+ next.set("ai", function (card) {
+ var player = _status.event.player;
+ if (player.hp == 1 || _status.event.getTrigger().num > 1) {
+ return 9 - get.value(card);
+ }
+ if (player.hp == 2) {
+ return 8 - get.value(card);
+ }
+ return 7 - get.value(card);
+ });
+ next.logSkill = "jiaojin";
+ "step 1";
+ if (result.bool) {
+ game.delay(0.5);
+ trigger.num--;
+ }
+ },
+ },
+ chanhui: {
+ audio: 2,
+ trigger: { player: "useCardToPlayer" },
+ filter: function (event, player) {
+ if (_status.currentPhase != player) return false;
+ if (player.hasSkill("chanhui2")) return false;
+ if (event.targets.length > 1) return false;
+ var card = event.card;
+ if (card.name == "sha") return true;
+ if (get.color(card) == "black" && get.type(card) == "trick") return true;
+ return false;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("chanhui"), function (card, player, target) {
+ if (player == target) return false;
+ var evt = _status.event.getTrigger();
+ return !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target);
+ })
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ return get.effect(target, trigger.card, player, player) + 0.01;
+ });
+ "step 1";
+ if (result.bool) {
+ event.target = result.targets[0];
+ } else {
+ event.finish();
+ }
+ "step 2";
+ player.addTempSkill("chanhui2");
+ player.logSkill("chanhui", event.target);
+ event.target.chooseCard("交给" + get.translation(player) + "一张手牌,或成为" + get.translation(trigger.card) + "的额外目标").set("ai", function (card) {
+ return 5 - get.value(card);
+ });
+ "step 3";
+ if (result.bool) {
+ target.give(result.cards, player);
+ trigger.untrigger();
+ trigger.getParent().player = event.target;
+ game.log(event.target, "成为了", trigger.card, "的使用者");
+ } else {
+ game.log(event.target, "成为了", trigger.card, "的额外目标");
+ trigger.getParent().targets.push(event.target);
+ }
+ },
+ },
+ rechanhui: {
+ audio: 2,
+ trigger: { player: "useCardToPlayer" },
+ filter: function (event, player) {
+ if (player.hasSkill("rechanhui2")) return false;
+ if (event.targets.length > 1) return false;
+ var card = event.card;
+ if (card.name == "sha" || get.type(card) == "trick") return true;
+ return false;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("rechanhui"), function (card, player, target) {
+ if (player == target) return false;
+ var trigger = _status.event;
+ return player.canUse(trigger.card, target, false) && trigger.targets.includes(target) == false;
+ })
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ return get.effect(target, trigger.card, player, player) + 0.01;
+ })
+ .set("targets", trigger.targets)
+ .set("card", trigger.card);
+ "step 1";
+ if (result.bool) {
+ //game.delay(0,200);
+ event.target = result.targets[0];
+ } else {
+ event.finish();
+ }
+ "step 2";
+ player.logSkill("rechanhui", event.target);
+ event.target.chooseCard("交给" + get.translation(player) + "一张牌,或成为" + get.translation(trigger.card) + "的额外目标", "he").set("ai", function (card) {
+ return 5 - get.value(card);
+ });
+ "step 3";
+ if (result.bool) {
+ target.give(result.cards, player);
+ trigger.untrigger();
+ trigger.getParent().player = event.target;
+ game.log(event.target, "成为了", trigger.card, "的使用者");
+ } else {
+ game.log(event.target, "成为了", trigger.card, "的额外目标");
+ trigger.getParent().targets.push(event.target);
+ player.addTempSkill("rechanhui2");
+ }
+ },
+ },
+ rechanhui2: { charlotte: true },
+ rejiaojin2: { charlotte: true },
+ rejiaojin: {
+ audio: 2,
+ trigger: { target: "useCardToTargeted" },
+ filter: function (event, player) {
+ return (
+ (event.card.name == "sha" || get.type(event.card) == "trick") &&
+ event.player != player &&
+ player.countCards("he", function (card) {
+ return _status.connectMode || get.type(card) == "equip";
+ }) &&
+ !player.hasSkill("rejiaojin2")
+ );
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var next = player.chooseToDiscard("he", "骄矜:是否弃置一张装备牌令" + get.translation(trigger.card) + "对你无效?", function (card, player) {
+ return get.type(card) == "equip";
+ });
+ next.set("ai", function (card) {
+ if (_status.event.goon2) {
+ return 3 + _status.event.val - get.value(card);
+ }
+ return 0;
+ });
+ next.set("val", get.value(trigger.cards.filterInD()));
+ next.set("goon2", get.effect(player, trigger.card, trigger.player, player) < 0);
+ next.logSkill = ["rejiaojin", trigger.player];
+ "step 1";
+ if (result.bool) {
+ var cards = trigger.cards.filterInD();
+ if (cards.length) player.gain(cards, "gain2", "log");
+ trigger.excluded.push(player);
+ if (trigger.player.hasSex("female")) player.addTempSkill("rejiaojin2");
+ }
+ },
+ },
+ chanhui2: {},
+ quanji: {
+ audio: 2,
+ trigger: { player: "damageEnd" },
+ frequent: true,
+ locked: false,
+ notemp: true,
+ filter: function (event) {
+ return event.num > 0;
+ },
+ content: function () {
+ "step 0";
+ event.count = trigger.num;
+ "step 1";
+ event.count--;
+ player.draw();
+ "step 2";
+ if (player.countCards("h")) {
+ player.chooseCard("将一张手牌置于武将牌上作为“权”", true);
+ } else {
+ event.goto(4);
+ }
+ "step 3";
+ if (result.cards && result.cards.length) {
+ player.addToExpansion(result.cards, player, "giveAuto").gaintag.add("quanji");
+ }
+ "step 4";
+ if (event.count > 0 && player.hasSkill(event.name) && !get.is.blocked(event.name, player)) {
+ player.chooseBool(get.prompt2("quanji")).set("frequentSkill", event.name);
+ } else event.finish();
+ "step 5";
+ if (result.bool) {
+ player.logSkill("quanji");
+ event.goto(1);
+ }
+ },
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ mod: {
+ maxHandcard: function (player, num) {
+ return num + player.getExpansions("quanji").length;
+ },
+ },
+ ai: {
+ maixie: true,
+ maixie_hp: true,
+ threaten: 0.8,
+ effect: {
+ target: function (card, player, target) {
+ if (get.tag(card, "damage")) {
+ if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
+ if (!target.hasFriend()) return;
+ if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2];
+ if (!target.hasSkill("paiyi") && target.hp > 1) return [0.5, get.tag(card, "damage") * 1.5];
+ if (target.hp == 3) return [0.5, get.tag(card, "damage") * 1.5];
+ if (target.hp == 2) return [1, get.tag(card, "damage") * 0.5];
+ }
+ },
+ },
+ },
+ },
+ zili: {
+ skillAnimation: true,
+ animationColor: "thunder",
+ audio: 2,
+ audioname: ["re_zhonghui"],
+ unique: true,
+ juexingji: true,
+ trigger: { player: "phaseZhunbeiBegin" },
+ forced: true,
+ derivation: "paiyi",
+ filter: function (event, player) {
+ return !player.hasSkill("paiyi") && player.getExpansions("quanji").length >= 3;
+ },
+ content: function () {
+ "step 0";
+ player.awakenSkill("zili");
+ player.chooseDrawRecover(2, true, function (event, player) {
+ if (player.hp == 1 && player.isDamaged()) return "recover_hp";
+ return "draw_card";
+ });
+ "step 1";
+ player.loseMaxHp();
+ player.addSkills("paiyi");
+ },
+ ai: {
+ combo: "quanji",
+ },
+ },
+ paiyi: {
+ enable: "phaseUse",
+ usable: 1,
+ audio: 2,
+ audioname: ["re_zhonghui"],
+ filter: function (event, player) {
+ return player.getExpansions("quanji").length > 0;
+ },
+ chooseButton: {
+ dialog: function (event, player) {
+ return ui.create.dialog("排异", player.getExpansions("quanji"), "hidden");
+ },
+ backup: function (links, player) {
+ return {
+ audio: "paiyi",
+ audioname: ["re_zhonghui"],
+ filterTarget: true,
+ filterCard: function () {
+ return false;
+ },
+ selectCard: -1,
+ card: links[0],
+ delay: false,
+ content: lib.skill.paiyi.contentx,
+ ai: {
+ order: 10,
+ result: {
+ target: function (player, target) {
+ if (player != target) return 0;
+ if (player.hasSkill("requanji") || player.countCards("h") + 2 <= player.hp + player.getExpansions("quanji").length) return 1;
+ return 0;
+ },
+ },
+ },
+ };
+ },
+ prompt: function () {
+ return "请选择〖排异〗的目标";
+ },
+ },
+ contentx: function () {
+ "step 0";
+ var card = lib.skill.paiyi_backup.card;
+ player.loseToDiscardpile(card);
+ "step 1";
+ target.draw(2);
+ "step 2";
+ if (target.countCards("h") > player.countCards("h")) {
+ target.damage();
+ }
+ },
+ ai: {
+ order: 1,
+ combo: "quanji",
+ result: {
+ player: 1,
+ },
+ },
+ },
+ xianzhou: {
+ skillAnimation: true,
+ animationColor: "gray",
+ audio: 2,
+ audioname: ["xin_caifuren"],
+ unique: true,
+ limited: true,
+ enable: "phaseUse",
+ filter: function (event, player) {
+ return player.countCards("e") > 0;
+ },
+ filterTarget: function (card, player, target) {
+ return player != target;
+ },
+ mark: true,
+ delay: false,
+ content: function () {
+ "step 0";
+ player.awakenSkill("xianzhou");
+ var cards = player.getCards("e");
+ player.give(cards, target);
+ event.num = cards.length;
+ game.delay();
+ "step 1";
+ target
+ .chooseTarget([1, event.num], "令" + get.translation(player) + "回复" + event.num + "点体力,或对攻击范围内的" + event.num + "名角色造成1点伤害", function (card, player, target2) {
+ return _status.event.player.inRange(target2);
+ })
+ .set("ai", function (target2) {
+ var target = _status.event.player;
+ var player = _status.event.getParent().player;
+ if (get.attitude(target, player) > 0) {
+ if (player.hp + event.num <= player.maxHp || player.hp == 1) return -1;
+ }
+ return get.damageEffect(target2, target, target);
+ });
+ "step 2";
+ if (result.bool) {
+ target.line(result.targets, "green");
+ event.targets = result.targets;
+ event.num2 = 0;
+ } else {
+ player.recover(event.num);
+ event.finish();
+ }
+ "step 3";
+ if (event.num2 < event.targets.length) {
+ event.targets[event.num2].damage(target);
+ event.num2++;
+ event.redo();
+ }
+ },
+ intro: {
+ content: "limited",
+ },
+ ai: {
+ order: 1,
+ result: {
+ target: 1,
+ player: function (player) {
+ var bool = true,
+ players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (players[i] != player && get.attitude(player, players[i]) > 2 && get.attitude(players[i], player) > 2) {
+ bool = false;
+ break;
+ }
+ }
+ if (bool) return -10;
+ if (player.hp == 1) return 1;
+ if (game.phaseNumber < game.players.length) return -10;
+ if (player.countCards("e") + player.hp <= player.maxHp) return 1;
+ return -10;
+ },
+ },
+ },
+ },
+ qieting: {
+ audio: 2,
+ trigger: { global: "phaseEnd" },
+ filter: function (event, player) {
+ if (event.player == player || !event.player.isIn()) return false;
+ var history = event.player.getHistory("useCard");
+ for (var i = 0; i < history.length; i++) {
+ if (!history[i].targets) continue;
+ for (var j = 0; j < history[i].targets.length; j++) {
+ if (history[i].targets[j] != event.player) return false;
+ }
+ }
+ return true;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var next;
+ if (
+ trigger.player.hasCard(function (card) {
+ return player.canEquip(card);
+ }, "e")
+ ) {
+ next = player
+ .chooseControl("移动装备", "draw_card", "cancel2", function (event, player) {
+ var source = _status.event.sourcex;
+ var att = get.attitude(player, source);
+ if (source.hasSkillTag("noe")) {
+ if (att > 0) {
+ return "移动装备";
+ }
+ } else {
+ if (
+ att <= 0 &&
+ source.countCards("e", function (card) {
+ return get.value(card, source) > 0 && get.effect(player, card, player, player) > 0;
+ })
+ ) {
+ return "移动装备";
+ }
+ }
+ return "draw_card";
+ })
+ .set("sourcex", trigger.player);
+ } else {
+ next = player.chooseControl("draw_card", "cancel2", function () {
+ return "draw_card";
+ });
+ }
+ next.set("prompt", get.prompt("qieting", trigger.player));
+ "step 1";
+ if (result.control == "移动装备") {
+ player.logSkill("qieting", trigger.player);
+ player
+ .choosePlayerCard(trigger.player, "e", "将一张装备牌移至你的装备区", true)
+ .set("filterButton", function (button) {
+ return _status.event.player.canEquip(button.link);
+ })
+ .set("ai", function (button) {
+ return get.effect(player, button.link, player, player);
+ });
+ } else {
+ if (result.control == "draw_card") {
+ player.logSkill("qieting");
+ player.draw();
+ }
+ event.finish();
+ }
+ "step 2";
+ if (result && result.links && result.links.length) {
+ game.delay(2);
+ trigger.player.$give(result.links[0], player, false);
+ player.equip(result.links[0]);
+ player.addExpose(0.2);
+ }
+ },
+ },
+ oldzhuikong: {
+ audio: "zhuikong",
+ inherit: "zhuikong",
+ },
+ zhuikong: {
+ audio: 2,
+ trigger: { global: "phaseZhunbeiBegin" },
+ check: function (event, player) {
+ if (get.attitude(player, event.player) < -2) {
+ var cards = player.getCards("h");
+ if (cards.length > player.hp) return true;
+ for (var i = 0; i < cards.length; i++) {
+ var useful = get.useful(cards[i]);
+ if (useful < 5) return true;
+ if (get.number(cards[i]) > 9 && useful < 7) return true;
+ }
+ }
+ return false;
+ },
+ logTarget: "player",
+ filter: function (event, player) {
+ return player.hp < player.maxHp && player.canCompare(event.player);
+ },
+ content: function () {
+ "step 0";
+ player.chooseToCompare(trigger.player);
+ "step 1";
+ if (result.bool) {
+ if (event.name == "zhuikong") trigger.player.addTempSkill("zishou2");
+ else trigger.player.skip("phaseUse");
+ } else {
+ trigger.player.storage.zhuikong_distance = player;
+ trigger.player.addTempSkill("zhuikong_distance");
+ }
+ },
+ subSkill: {
+ distance: {
+ sub: true,
+ onremove: true,
+ mod: {
+ globalFrom: function (from, to, distance) {
+ if (from.storage.zhuikong_distance == to) return -Infinity;
+ },
+ },
+ },
+ },
+ },
+ oldqiuyuan: {
+ audio: "qiuyuan",
+ inherit: "qiuyuan",
+ filter: function (event, player) {
+ return (
+ event.card.name == "sha" &&
+ game.hasPlayer(function (current) {
+ return current != player && !event.targets.includes(current) && current.countCards("h") > 0 && lib.filter.targetEnabled(event.card, event.player, current);
+ })
+ );
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("oldqiuyuan"), function (card, player, target) {
+ var evt = _status.event.getTrigger();
+ return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target) && target.countCards("h") > 0;
+ })
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ return get.effect(target, trigger.card, trigger.player, player) + 0.1;
+ })
+ .set("targets", trigger.targets)
+ .set("playerx", trigger.player);
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("oldqiuyuan", target);
+ event.target = target;
+ target
+ .chooseCard("交给" + get.translation(player) + "一张牌,若此牌不为【闪】,则也成为此杀的额外目标", true)
+ .set("ai", function (card) {
+ return -get.value(card, player, "raw");
+ })
+ .set("sourcex", player);
+ game.delay();
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool) {
+ target.give(result.cards, player, "give");
+ if (get.name(result.cards[0]) != "shan") {
+ trigger.getParent().targets.push(event.target);
+ trigger.getParent().triggeredTargets2.push(event.target);
+ game.log(event.target, "成为了额外目标");
+ }
+ game.delay();
+ }
+ },
+ },
+ qiuyuan: {
+ audio: 2,
+ trigger: { target: "useCardToTarget" },
+ direct: true,
+ filter: function (event, player) {
+ return (
+ event.card.name == "sha" &&
+ game.hasPlayer(function (current) {
+ return current != player && !event.targets.includes(current) && lib.filter.targetEnabled(event.card, event.player, current);
+ })
+ );
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("qiuyuan"), function (card, player, target) {
+ var evt = _status.event.getTrigger();
+ return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled(evt.card, evt.player, target);
+ })
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ return get.effect(target, trigger.card, trigger.player, player) + 0.1;
+ })
+ .set("targets", trigger.targets)
+ .set("playerx", trigger.player);
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("qiuyuan", target);
+ event.target = target;
+ target
+ .chooseCard({ name: "shan" }, "交给" + get.translation(player) + "一张闪,或成为此杀的额外目标")
+ .set("ai", function (card) {
+ return get.attitude(target, _status.event.sourcex) >= 0 ? 1 : -1;
+ })
+ .set("sourcex", player);
+ game.delay();
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool) {
+ target.give(result.cards, player);
+ game.delay();
+ } else {
+ trigger.getParent().targets.push(event.target);
+ trigger.getParent().triggeredTargets2.push(event.target);
+ game.log(event.target, "成为了额外目标");
+ }
+ },
+ ai: {
+ expose: 0.2,
+ effect: {
+ target: function (card, player, target) {
+ if (card.name != "sha") return;
+ var players = game.filterPlayer();
+ if (get.attitude(player, target) <= 0) {
+ for (var i = 0; i < players.length; i++) {
+ var target2 = players[i];
+ if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, target) > 0 && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) < 0) {
+ if (target.hp == target.maxHp) return 0.3;
+ return 0.6;
+ }
+ }
+ } else {
+ for (var i = 0; i < players.length; i++) {
+ var target2 = players[i];
+ if (player != target2 && target != target2 && player.canUse(card, target2, false) && get.effect(target2, { name: "shacopy", nature: card.nature, suit: card.suit }, player, player) > 0) {
+ if (player.canUse(card, target2)) return;
+ if (target.hp == target.maxHp) return [0, 1];
+ return [0, 0];
+ }
+ }
+ }
+ },
+ },
+ },
+ },
+ gongji: {
+ enable: "phaseUse",
+ usable: 1,
+ audio: 2,
+ position: "he",
+ filterCard: true,
+ check: function (card) {
+ if (get.type(card) != "equip") return 0;
+ var player = _status.currentPhase;
+ if (player.countCards("he", { subtype: get.subtype(card) }) > 1) {
+ return 11 - get.equipValue(card);
+ }
+ return 6 - get.equipValue(card);
+ },
+ content: function () {
+ "step 0";
+ player.addTempSkill("gongji2");
+ "step 1";
+ if (get.type(cards[0], null, cards[0].original == "h" ? player : false) == "equip") {
+ player
+ .chooseTarget("是否弃置一名角色的一张牌?", function (card, player, target) {
+ return player != target && target.countCards("he") > 0;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ if (get.attitude(player, target) < 0) {
+ return Math.max(0.5, get.effect(target, { name: "sha" }, player, player));
+ }
+ return 0;
+ });
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool) {
+ player.line(result.targets, "green");
+ event.target = result.targets[0];
+ player.discardPlayerCard(event.target, "he", true).ai = get.buttonValue;
+ }
+ },
+ ai: {
+ order: 9,
+ result: {
+ player: 1,
+ },
+ },
+ },
+ gongji2: {
+ mod: {
+ attackRangeBase: function () {
+ return Infinity;
+ },
+ },
+ },
+ zhuiyi: {
+ audio: 2,
+ audioname: ["re_bulianshi"],
+ trigger: { player: "die" },
+ direct: true,
+ skillAnimation: true,
+ animationColor: "wood",
+ forceDie: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("zhuiyi"), function (card, player, target) {
+ return player != target && _status.event.sourcex != target;
+ })
+ .set("forceDie", true)
+ .set("ai", function (target) {
+ var num = get.attitude(_status.event.player, target);
+ if (num > 0) {
+ if (target.hp == 1) {
+ num += 2;
+ }
+ if (target.hp < target.maxHp) {
+ num += 2;
+ }
+ }
+ return num;
+ })
+ .set("sourcex", trigger.source);
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("zhuiyi", target);
+ player.line(target, "green");
+ target.recover();
+ target.draw(3);
+ }
+ },
+ ai: {
+ expose: 0.5,
+ },
+ },
+ old_anxu: {
+ enable: "phaseUse",
+ usable: 1,
+ multitarget: true,
+ audio: "anxu",
+ filterTarget: function (card, player, target) {
+ if (player == target) return false;
+ var num = target.countCards("h");
+ if (ui.selected.targets.length) {
+ return num < ui.selected.targets[0].countCards("h");
+ }
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (num > players[i].countCards("h")) return true;
+ }
+ return false;
+ },
+ selectTarget: 2,
+ content: function () {
+ "step 0";
+ var gainner, giver;
+ if (targets[0].countCards("h") < targets[1].countCards("h")) {
+ gainner = targets[0];
+ giver = targets[1];
+ } else {
+ gainner = targets[1];
+ giver = targets[0];
+ }
+ gainner.gainPlayerCard(giver, true, "h", "visibleMove");
+ event.gainner = gainner;
+ event.giver = giver;
+ "step 1";
+ if (result.cards) {
+ event.bool = false;
+ var card = result.cards[0];
+ if (get.suit(card) != "spade") event.bool = true;
+ }
+ "step 2";
+ if (event.bool) {
+ player.draw();
+ }
+ },
+ ai: {
+ order: 10.5,
+ threaten: 2.3,
+ result: {
+ target: function (player, target) {
+ var num = target.countCards("h");
+ var att = get.attitude(player, target);
+ if (ui.selected.targets.length == 0) {
+ if (att > 0) return -1;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ var num2 = players[i].countCards("h");
+ var att2 = get.attitude(player, players[i]);
+ if (num2 < num) {
+ if (att2 > 0) return -3;
+ return -1;
+ }
+ }
+ return 0;
+ } else {
+ return 1;
+ }
+ },
+ player: 1,
+ },
+ },
+ },
+ anxu: {
+ enable: "phaseUse",
+ usable: 1,
+ multitarget: true,
+ audio: 2,
+ filterTarget: function (card, player, target) {
+ if (player == target) return false;
+ var num = target.countCards("h");
+ if (ui.selected.targets.length) {
+ return num < ui.selected.targets[0].countCards("h");
+ }
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (num > players[i].countCards("h")) return true;
+ }
+ return false;
+ },
+ selectTarget: 2,
+ content: function () {
+ "step 0";
+ var gainner, giver;
+ if (targets[0].countCards("h") < targets[1].countCards("h")) {
+ gainner = targets[0];
+ giver = targets[1];
+ } else {
+ gainner = targets[1];
+ giver = targets[0];
+ }
+ giver.chooseCard("选择一张手牌交给" + get.translation(gainner), true);
+ event.gainner = gainner;
+ event.giver = giver;
+ "step 1";
+ var card = result.cards[0];
+ event.giver.give(card, event.gainner);
+ "step 2";
+ if (event.gainner.countCards("h") == event.giver.countCards("h")) {
+ player.chooseDrawRecover(true);
+ }
+ },
+ ai: {
+ order: 10.5,
+ threaten: 1.6,
+ result: {
+ target: function (player, target) {
+ var num = target.countCards("h");
+ var att = get.attitude(player, target);
+ if (ui.selected.targets.length == 0) {
+ if (att > 0) return -1;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ var num2 = players[i].countCards("h");
+ var att2 = get.attitude(player, players[i]);
+ if (att2 >= 0 && num2 < num) return -1;
+ }
+ return 0;
+ } else {
+ return 1;
+ }
+ },
+ player: 0.1,
+ },
+ },
+ },
+ mingce: {
+ enable: "phaseUse",
+ usable: 1,
+ audio: 2,
+ position: "he",
+ filterCard: function (card) {
+ return get.name(card) == "sha" || get.type(card) == "equip";
+ },
+ filter: function (event, player) {
+ return player.countCards("h", "sha") > 0 || player.countCards("he", { type: "equip" }) > 0;
+ },
+ check: function (card) {
+ return 8 - get.value(card);
+ },
+ selectTarget: 2,
+ multitarget: true,
+ discard: false,
+ lose: false,
+ targetprompt: ["得到牌", "出杀目标"],
+ filterTarget: function (card, player, target) {
+ if (ui.selected.targets.length == 0) {
+ return player != target;
+ } else {
+ return ui.selected.targets[0].inRange(target);
+ }
+ },
+ delay: false,
+ content: function () {
+ "step 0";
+ player.give(cards, targets[0], "visible");
+ "step 1";
+ if (!lib.filter.filterTarget({ name: "sha", isCard: true }, targets[0], targets[1])) event._result = { control: "draw_card" };
+ else
+ targets[0]
+ .chooseControl("draw_card", "出杀", function () {
+ var player = _status.event.player;
+ var target = _status.event.target;
+ if (get.effect(_status.event.target, { name: "sha" }, player, player) > 0) {
+ return 1;
+ }
+ return 0;
+ })
+ .set("target", targets[1])
+ .set("prompt", "对" + get.translation(targets[1]) + "使用一张杀,或摸一张牌");
+ "step 2";
+ if (result.control == "draw_card") {
+ targets[0].draw();
+ } else {
+ targets[0].useCard({ name: "sha", isCard: true }, targets[1]);
+ }
+ },
+ ai: {
+ result: {
+ player: function (player) {
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (players[i] != player && get.attitude(player, players[i]) > 1 && get.attitude(players[i], player) > 1) {
+ return 1;
+ }
+ }
+ return 0;
+ },
+ target: function (player, target) {
+ if (ui.selected.targets.length) {
+ return -0.1;
+ }
+ return 1;
+ },
+ },
+ order: 8.5,
+ expose: 0.2,
+ },
+ },
+ xinxuanhuo: {
+ audio: 2,
+ trigger: { player: "phaseDrawBegin1" },
+ direct: true,
+ filter: function (event, player) {
+ return !event.numFixed;
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("xinxuanhuo"), function (card, player, target) {
+ return player != target;
+ })
+ .set("ai", function (target) {
+ var att = get.attitude(_status.event.player, target);
+ if (att > 0) {
+ if (target.countCards("h") < target.hp) att += 2;
+ return att - target.countCards("h") / 3;
+ } else {
+ return -1;
+ }
+ });
+ "step 1";
+ if (result.bool) {
+ trigger.changeToZero();
+ player.logSkill("xinxuanhuo", result.targets);
+ event.target = result.targets[0];
+ event.target.draw(2);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (
+ game.hasPlayer(function (current) {
+ return target.canUse("sha", current);
+ })
+ )
+ player
+ .chooseTarget("选择出杀的目标", true, function (card, player, target) {
+ return _status.event.target.canUse("sha", target);
+ })
+ .set("ai", function (target) {
+ return get.effect(target, { name: "sha" }, _status.event.target, _status.event.player);
+ })
+ .set("target", event.target);
+ "step 3";
+ if (result.bool && result.targets.length) {
+ game.log(player, "指定的出杀目标为", result.targets);
+ event.target.line(result.targets);
+ event.target.chooseToUse("对" + get.translation(result.targets) + "使用一张杀,或令" + get.translation(player) + "获得你的两张牌", { name: "sha" }, result.targets[0], -1);
+ } else {
+ event.bool = true;
+ }
+ "step 4";
+ if (event.bool || result.bool == false) {
+ player.gainPlayerCard("he", event.target, Math.min(2, event.target.countCards("he")), true);
+ }
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ zhichi: {
+ audio: 2,
+ trigger: { player: "damageEnd" },
+ audioname: ["re_chengong"],
+ forced: true,
+ filter: function (event, player) {
+ return _status.currentPhase != player;
+ },
+ content: function () {
+ player.addTempSkill("zhichi2", ["phaseAfter", "phaseBefore"]);
+ },
+ },
+ zhichi2: {
+ trigger: { target: "useCardToBefore" },
+ forced: true,
+ charlotte: true,
+ priority: 15,
+ filter: function (event, player) {
+ return get.type(event.card) == "trick" || event.card.name == "sha";
+ },
+ content: function () {
+ game.log(player, "发动了智迟,", trigger.card, "对", trigger.target, "失效");
+ trigger.cancel();
+ },
+ mark: true,
+ intro: {
+ content: "杀或普通锦囊牌对你无效",
+ },
+ ai: {
+ effect: {
+ target: function (card, player, target, current) {
+ if (get.type(card) == "trick" || card.name == "sha") return "zeroplayertarget";
+ },
+ },
+ },
+ },
+ zongxuan: {
+ audio: 2,
+ trigger: {
+ player: "loseAfter",
+ global: "loseAsyncAfter",
+ },
+ filter: function (event, player) {
+ if (event.type != "discard" || event.getlx === false) return;
+ var evt = event.getl(player);
+ for (var i = 0; i < evt.cards2.length; i++) {
+ if (get.position(evt.cards2[i]) == "d") {
+ return true;
+ }
+ }
+ return false;
+ },
+ check: function (trigger, player) {
+ if (
+ trigger.getParent(3).name != "phaseDiscard" ||
+ !game.hasPlayer(function (current) {
+ return current.isDamaged() && get.recoverEffect(current, player, player) > 0;
+ })
+ )
+ return false;
+ var evt = trigger.getl(player);
+ for (var i = 0; i < evt.cards2.length; i++) {
+ if (get.position(evt.cards2[i], true) == "d" && get.type(evt.cards2[i], false) == "equip") {
+ return true;
+ }
+ }
+ return false;
+ },
+ content: function () {
+ "step 0";
+ var cards = [];
+ var evt = trigger.getl(player);
+ for (var i = 0; i < evt.cards2.length; i++) {
+ if (get.position(evt.cards2[i], true) == "d") {
+ cards.push(evt.cards2[i]);
+ }
+ }
+ var next = player.chooseToMove("纵玄:将任意张牌置于牌堆顶", true);
+ next.set("list", [["本次弃置的牌", cards], ["牌堆顶"]]);
+ next.set("filterOk", function (moved) {
+ return moved[1].length > 0;
+ });
+ next.set("processAI", function (list) {
+ var cards = list[0][1].slice(0),
+ cards2 = cards.filter(function (i) {
+ return get.type(i, false) == "equip";
+ }),
+ cards3;
+ if (cards2.length) {
+ cards3 = cards2.randomGet();
+ } else cards3 = cards.randomGet();
+ return [[], [cards3]];
+ });
+ "step 1";
+ if (result.bool) {
+ var cards = result.moved[1];
+ game.log(player, "将", cards, "置于了牌堆顶");
+ while (cards.length) ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild);
+ }
+ },
+ },
+ zhiyan: {
+ audio: 2,
+ audioname: ["gexuan", "re_yufan"],
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ content: function () {
+ "step 0";
+ player.chooseTarget(get.prompt("zhiyan"), "令一名角色摸一张牌并展示之。若为装备牌,则其回复1点体力").set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ });
+ "step 1";
+ if (result.bool) {
+ event.target = result.targets[0];
+ player.logSkill("zhiyan", result.targets);
+ event.bool = false;
+ event.target.draw("visible");
+ } else {
+ event.finish();
+ }
+ "step 2";
+ var card = result[0];
+ if (get.type(card) == "equip") {
+ if (target.getCards("h").includes(card) && target.hasUseTarget(card)) {
+ event.target.chooseUseTarget(card, true, "nopopup");
+ game.delay();
+ }
+ event.bool = true;
+ }
+ "step 3";
+ if (event.bool) target.recover();
+ },
+ ai: {
+ expose: 0.2,
+ threaten: 1.2,
+ },
+ },
+ miji: {
+ audio: 2,
+ audioname: ["re_wangyi"],
+ locked: false,
+ mod: {
+ aiOrder: function (player, card, num) {
+ if (num > 0 && _status.event && _status.event.type === "phase" && get.tag(card, "recover")) {
+ if (player.needsToDiscard()) return num / 3;
+ return 0;
+ }
+ },
+ },
+ trigger: { player: "phaseJieshuBegin" },
+ filter: function (event, player) {
+ return player.hp < player.maxHp;
+ },
+ content: function () {
+ "step 0";
+ event.num = player.getDamagedHp();
+ player.draw(event.num);
+ if (_status.connectMode)
+ game.broadcastAll(function () {
+ _status.noclearcountdown = true;
+ });
+ event.given_map = {};
+ event._forcing = false;
+ event.aicheck = (function () {
+ let res = {
+ bool: true,
+ cards: [],
+ },
+ cards = player.getCards("he"),
+ tars = game.filterPlayer(i => player !== i);
+ cards.forEach(i => {
+ let o = get.value(i, player),
+ max = o,
+ temp,
+ t;
+ tars.forEach(tar => {
+ temp = get.value(i, tar);
+ if (temp > max) {
+ max = temp;
+ t = tar;
+ }
+ });
+ if (t) res.cards.push([i, t, max - o]);
+ });
+ if (res.cards.length < event.num) res.bool = false;
+ else if (res.cards.length > event.num)
+ res.cards
+ .sort((a, b) => {
+ return b[2] - a[2];
+ })
+ .slice(0, event.num);
+ return res;
+ })();
+ "step 1";
+ player.chooseCardTarget({
+ filterCard(card) {
+ return get.itemtype(card) == "card" && !card.hasGaintag("miji_tag");
+ },
+ filterTarget: lib.filter.notMe,
+ selectCard: [1, event.num],
+ prompt: "请选择要分配的卡牌和目标",
+ forced: event._forcing,
+ ai1(card) {
+ if (!_status.event.res.bool || ui.selected.cards.length) return 0;
+ for (let arr of _status.event.res.cards) {
+ if (arr[0] === card) return arr[2];
+ }
+ return 0;
+ },
+ ai2(target) {
+ let card = ui.selected.cards[0];
+ for (let arr of _status.event.res.cards) {
+ if (arr[0] === card) return get.attitude(player, target);
+ }
+ let val = target.getUseValue(card);
+ if (val > 0) return val * get.attitude(player, target) * 2;
+ return get.value(card, target) * get.attitude(player, target);
+ },
+ res: event.aicheck,
+ });
+ "step 2";
+ if (result.bool) {
+ event._forcing = true;
+ var res = result.cards,
+ target = result.targets[0].playerid;
+ player.addGaintag(res, "miji_tag");
+ event.num -= res.length;
+ if (!event.given_map[target]) event.given_map[target] = [];
+ event.given_map[target].addArray(res);
+ if (event.num > 0) event.goto(1);
+ }
+ "step 3";
+ if (_status.connectMode) {
+ game.broadcastAll(function () {
+ delete _status.noclearcountdown;
+ game.stopCountChoose();
+ });
+ }
+ var map = [],
+ cards = [];
+ for (var i in event.given_map) {
+ var source = (_status.connectMode ? lib.playerOL : game.playerMap)[i];
+ player.line(source, "green");
+ if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.18);
+ map.push([source, event.given_map[i]]);
+ cards.addArray(event.given_map[i]);
+ }
+ game.loseAsync({
+ gain_list: map,
+ player: player,
+ cards: cards,
+ giver: player,
+ animate: "giveAuto",
+ }).setContent("gaincardMultiple");
+ },
+ ai: {
+ threaten: function (player, target) {
+ return 0.6 + 0.7 * target.getDamagedHp();
+ },
+ effect: {
+ target: function (card, player, target) {
+ if (target.hp <= 2 && get.tag(card, "damage")) {
+ var num = 1;
+ if (
+ get.itemtype(player) == "player" &&
+ player.hasSkillTag("damageBonus", false, {
+ target: target,
+ card: card,
+ }) &&
+ !target.hasSkillTag("filterDamage", null, {
+ player: player,
+ card: card,
+ })
+ )
+ num = 2;
+ if (target.hp > num) return [1, 1];
+ }
+ },
+ },
+ },
+ },
+ zhenlie: {
+ audio: 2,
+ audioname: ["re_wangyi"],
+ filter: function (event, player) {
+ return event.player != player && event.card && (event.card.name == "sha" || get.type(event.card) == "trick");
+ },
+ logTarget: "player",
+ check: function (event, player) {
+ if (event.getParent().excluded.includes(player)) return false;
+ if (get.attitude(player, event.player) > 0 || (player.hp < 2 && !get.tag(event.card, "damage"))) return false;
+ let evt = event.getParent(),
+ directHit = (evt.nowuxie && get.type(event.card, "trick") === "trick") || (evt.directHit && evt.directHit.includes(player)) || (evt.customArgs && evt.customArgs.default && evt.customArgs.default.directHit2);
+ if (get.tag(event.card, "respondSha")) {
+ if (directHit || player.countCards("h", { name: "sha" }) === 0) return true;
+ } else if (get.tag(event.card, "respondShan")) {
+ if (directHit || player.countCards("h", { name: "shan" }) === 0) return true;
+ } else if (get.tag(event.card, "damage")) {
+ if (event.card.name === "huogong") return event.player.countCards("h") > 4 - player.hp - player.hujia;
+ if (event.card.name === "shuiyanqijunx") return player.countCards("e") === 0;
+ return true;
+ } else if (player.hp > 2) {
+ if (event.card.name === "shunshou" || (event.card.name === "zhujinqiyuan" && (event.card.yingbian || get.distance(event.player, player) < 0))) return true;
+ }
+ return false;
+ },
+ trigger: { target: "useCardToTargeted" },
+ content: function () {
+ "step 0";
+ if (get.attitude(player, trigger.player) < 0 && trigger.player.countDiscardableCards(player, "he")) player.addTempSkill("zhenlie_lose");
+ player.loseHp();
+ "step 1";
+ player.removeSkill("zhenlie_lose");
+ trigger.getParent().excluded.add(player);
+ "step 2";
+ if (trigger.player.countCards("he")) {
+ if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.12);
+ player.discardPlayerCard(trigger.player, "he", true);
+ }
+ },
+ subSkill: {
+ lose: {
+ charlotte: true,
+ },
+ },
+ ai: {
+ filterDamage: true,
+ skillTagFilter: (player, tag, arg) => {
+ return arg && arg.jiu == true;
+ },
+ effect: {
+ target: (card, player, target) => {
+ if (target.hp <= 0 && target.hasSkill("zhenlie_lose") && get.tag(card, "recover")) return [1, 1.2];
+ },
+ },
+ },
+ },
+ //吾彦...
+ wuyan: { audio: 2 },
+ xswuyan: {
+ audio: "wuyan",
+ trigger: { target: "useCardToBefore", player: "useCardToBefore" },
+ forced: true,
+ check: function (event, player) {
+ return get.effect(event.target, event.card, event.player, player) < 0;
+ },
+ filter: function (event, player) {
+ if (!event.target) return false;
+ if (event.player == player && event.target == player) return false;
+ return get.type(event.card) == "trick";
+ },
+ content: function () {
+ trigger.cancel();
+ },
+ ai: {
+ effect: {
+ target: function (card, player, target, current) {
+ if (get.type(card) == "trick" && player != target) return "zeroplayertarget";
+ },
+ player: function (card, player, target, current) {
+ if (get.type(card) == "trick" && player != target) return "zeroplayertarget";
+ },
+ },
+ },
+ },
+ xinwuyan: {
+ audio: 2,
+ trigger: { source: "damageBegin2", player: "damageBegin4" },
+ forced: true,
+ check: function (event, player) {
+ if (player == event.player) return true;
+ return false;
+ },
+ filter: function (event, player) {
+ return get.type(event.card, "trick") == "trick";
+ },
+ content: function () {
+ trigger.cancel();
+ },
+ ai: {
+ notrick: true,
+ notricksource: true,
+ effect: {
+ target: function (card, player, target, current) {
+ if (get.type(card) == "trick" && get.tag(card, "damage")) {
+ return "zeroplayertarget";
+ }
+ },
+ player: function (card, player, target, current) {
+ if (get.type(card) == "trick" && get.tag(card, "damage")) {
+ return "zeroplayertarget";
+ }
+ },
+ },
+ },
+ },
+ xinjujian: {
+ trigger: { player: "phaseJieshuBegin" },
+ direct: true,
+ audio: 2,
+ filter: function (event, player) {
+ return player.countCards("he") > player.countCards("he", { type: "basic" });
+ },
+ content: function () {
+ "step 0";
+ player.chooseCardTarget({
+ filterTarget: function (card, player, target) {
+ return player != target;
+ },
+ filterCard: function (card, player) {
+ return get.type(card) != "basic" && lib.filter.cardDiscardable(card, player);
+ },
+ ai1: function (card) {
+ if (get.tag(card, "damage") && get.type(card) == "trick") {
+ return 20;
+ }
+ return 9 - get.value(card);
+ },
+ ai2: function (target) {
+ var att = get.attitude(_status.event.player, target);
+ if (att > 0) {
+ if (target.isTurnedOver()) att += 3;
+ if (target.hp == 1) att += 3;
+ }
+ return att;
+ },
+ position: "he",
+ prompt: get.prompt2("xinjujian"),
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ event.target = target;
+ player.logSkill("xinjujian", target);
+ player.discard(result.cards);
+ if (target.hp == target.maxHp && !target.isTurnedOver() && !target.isLinked()) {
+ target.draw(2);
+ event.finish();
+ } else {
+ var controls = ["draw_card"];
+ if (target.hp < target.maxHp) {
+ controls.push("recover_hp");
+ }
+ if (target.isLinked() | target.isTurnedOver()) {
+ controls.push("reset_character");
+ }
+ target.chooseControl(controls).ai = function () {
+ if (target.isTurnedOver()) {
+ return "reset_character";
+ } else if (target.hp == 1 && target.maxHp > 2) {
+ return "recover_hp";
+ } else if (target.hp == 2 && target.maxHp > 2 && target.countCards("h") > 1) {
+ return "recover_hp";
+ } else {
+ return "draw_card";
+ }
+ };
+ }
+ } else {
+ event.finish();
+ }
+ "step 2";
+ event.control = result.control;
+ switch (event.control) {
+ case "recover_hp":
+ event.target.recover();
+ event.finish();
+ break;
+ case "draw_card":
+ event.target.draw(2);
+ event.finish();
+ break;
+ case "reset_character":
+ if (event.target.isTurnedOver()) event.target.turnOver();
+ break;
+ }
+ "step 3";
+ if (event.control == "reset_character" && event.target.isLinked()) {
+ event.target.link();
+ }
+ },
+ ai: {
+ expose: 0.2,
+ threaten: 1.4,
+ },
+ },
+ jujian: {
+ enable: "phaseUse",
+ usable: 1,
+ audio: 2,
+ filterCard: true,
+ position: "he",
+ selectCard: [1, 3],
+ check: function (card) {
+ var player = get.owner(card);
+ if (get.type(card) == "trick") return 10;
+ if (player.countCards("h") - player.hp - ui.selected.cards.length > 0) {
+ return 8 - get.value(card);
+ }
+ return 4 - get.value(card);
+ },
+ filterTarget: function (card, player, target) {
+ return player != target;
+ },
+ content: function () {
+ target.draw(cards.length);
+ if (cards.length == 3) {
+ if (get.type(cards[0], "trick") == get.type(cards[1], "trick") && get.type(cards[0], "trick") == get.type(cards[2], "trick")) {
+ player.recover();
+ }
+ }
+ },
+ ai: {
+ expose: 0.2,
+ order: 1,
+ result: {
+ target: 1,
+ },
+ },
+ },
+ yizhong: {
+ trigger: { target: "shaBefore" },
+ forced: true,
+ audio: 2,
+ filter: function (event, player) {
+ if (!player.hasEmptySlot(2)) return false;
+ return event.card.name == "sha" && get.color(event.card) == "black";
+ },
+ content: function () {
+ trigger.cancel();
+ },
+ ai: {
+ effect: {
+ target: function (card, player, target) {
+ if (player == target && get.subtypes(card).includes("equip2")) {
+ if (get.equipValue(card) <= 8) return 0;
+ }
+ if (!player.hasEmptySlot(2)) return;
+ if (card.name == "sha" && get.color(card) == "black") return "zerotarget";
+ },
+ },
+ },
+ },
+ jueqing: {
+ trigger: { source: "damageBefore" },
+ forced: true,
+ audio: 2,
+ //priority:16,
+ check: function () {
+ return false;
+ },
+ content: function () {
+ trigger.cancel();
+ trigger.player.loseHp(trigger.num);
+ },
+ ai: {
+ jueqing: true,
+ },
+ },
+ shangshi: {
+ audio: 2,
+ trigger: {
+ player: ["loseAfter", "changeHp", "gainMaxHpAfter", "loseMaxHpAfter"],
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ frequent: true,
+ filter: function (event, player) {
+ if (event.getl && !event.getl(player)) return false;
+ return player.countCards("h") < player.getDamagedHp();
+ },
+ content: function () {
+ player.draw(player.getDamagedHp() - player.countCards("h"));
+ },
+ ai: {
+ noh: true,
+ skillTagFilter: function (player, tag) {
+ if (tag == "noh" && player.maxHp - player.hp < player.countCards("h")) {
+ return false;
+ }
+ },
+ },
+ },
+ luoying: {
+ //unique:true,
+ //gainable:true,
+ group: ["luoying_discard", "luoying_judge"],
+ subfrequent: ["judge"],
+ subSkill: {
+ discard: {
+ audio: 2,
+ trigger: { global: "loseAfter" },
+ filter: function (event, player) {
+ if (event.type != "discard" || event.getlx === false) return false;
+ var cards = event.cards.slice(0);
+ var evt = event.getl(player);
+ if (evt && evt.cards) cards.removeArray(evt.cards);
+ for (var i = 0; i < cards.length; i++) {
+ if (cards[i].original != "j" && get.suit(cards[i], event.player) == "club" && get.position(cards[i], true) == "d") {
+ return true;
+ }
+ }
+ return false;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ if (trigger.delay == false) game.delay();
+ "step 1";
+ var cards = [],
+ cards2 = trigger.cards.slice(0),
+ evt = trigger.getl(player);
+ if (evt && evt.cards) cards2.removeArray(evt.cards);
+ for (var i = 0; i < cards2.length; i++) {
+ if (cards2[i].original != "j" && get.suit(cards2[i], trigger.player) == "club" && get.position(cards2[i], true) == "d") {
+ cards.push(cards2[i]);
+ }
+ }
+ if (cards.length) {
+ player.chooseButton(["落英:选择要获得的牌", cards], [1, cards.length]).set("ai", function (button) {
+ return get.value(button.link, _status.event.player, "raw");
+ });
+ }
+ "step 2";
+ if (result.bool) {
+ player.logSkill(event.name);
+ player.gain(result.links, "gain2", "log");
+ }
+ },
+ },
+ judge: {
+ audio: 2,
+ trigger: { global: "cardsDiscardAfter" },
+ //frequent:'check',
+ direct: true,
+ filter: function (event, player) {
+ var evt = event.getParent().relatedEvent;
+ if (!evt || evt.name != "judge") return;
+ if (evt.player == player) return false;
+ if (get.position(event.cards[0], true) != "d") return false;
+ return get.suit(event.cards[0]) == "club";
+ },
+ content: function () {
+ "step 0";
+ player.chooseButton(["落英:选择要获得的牌", trigger.cards], [1, trigger.cards.length]).set("ai", function (button) {
+ return get.value(button.link, _status.event.player, "raw");
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill(event.name);
+ player.gain(result.links, "gain2", "log");
+ }
+ },
+ },
+ },
+ },
+ jiushi: {
+ audio: "jiushi1",
+ group: ["jiushi1", "jiushi2", "jiushi3"],
+ },
+ jiushi1: {
+ audio: 2,
+ enable: "chooseToUse",
+ hiddenCard: function (player, name) {
+ if (name == "jiu") return !player.isTurnedOver();
+ return false;
+ },
+ filter: function (event, player) {
+ if (player.classList.contains("turnedover")) return false;
+ return event.filterCard({ name: "jiu", isCard: true }, player, event);
+ },
+ content: function () {
+ if (_status.event.getParent(2).type == "dying") {
+ event.dying = player;
+ event.type = "dying";
+ }
+ player.turnOver();
+ player.useCard({ name: "jiu", isCard: true }, player);
+ },
+ ai: {
+ order: 5,
+ result: {
+ player: function (player) {
+ if (_status.event.parent.name == "phaseUse") {
+ if (player.countCards("h", "jiu") > 0) return 0;
+ if (player.getEquip("zhuge") && player.countCards("h", "sha") > 1) return 0;
+ if (!player.countCards("h", "sha")) return 0;
+ var targets = [];
+ var target;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (get.attitude(player, players[i]) < 0) {
+ if (player.canUse("sha", players[i], true, true)) {
+ targets.push(players[i]);
+ }
+ }
+ }
+ if (targets.length) {
+ target = targets[0];
+ } else {
+ return 0;
+ }
+ var num = get.effect(target, { name: "sha" }, player, player);
+ for (var i = 1; i < targets.length; i++) {
+ var num2 = get.effect(targets[i], { name: "sha" }, player, player);
+ if (num2 > num) {
+ target = targets[i];
+ num = num2;
+ }
+ }
+ if (num <= 0) return 0;
+ var e2 = target.getEquip(2);
+ if (e2) {
+ if (e2.name == "tengjia") {
+ if (!player.countCards("h", { name: "sha", nature: "fire" }) && !player.getEquip("zhuque")) return 0;
+ }
+ if (e2.name == "renwang") {
+ if (!player.countCards("h", { name: "sha", color: "red" })) return 0;
+ }
+ if (e2.name == "baiyin") return 0;
+ }
+ if (player.getEquip("guanshi") && player.countCards("he") > 2) return 1;
+ return target.countCards("h") > 3 ? 0 : 1;
+ }
+ if (player == _status.event.dying || player.isTurnedOver()) return 3;
+ },
+ },
+ effect: {
+ target: function (card, player, target) {
+ if (card.name == "guiyoujie") return [0, 0.5];
+ if (target.isTurnedOver()) {
+ if (get.tag(card, "damage")) {
+ if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
+ if (target.hp == 1) return;
+ return [1, target.countCards("h") / 2];
+ }
+ }
+ },
+ },
+ },
+ },
+ jiushi2: {
+ trigger: { player: "damageBegin3" },
+ silent: true,
+ firstDo: true,
+ filter: function (event, player) {
+ return player.classList.contains("turnedover");
+ },
+ content: function () {
+ trigger.jiushi = true;
+ },
+ },
+ jiushi3: {
+ audio: "jiushi1",
+ trigger: { player: "damageEnd" },
+ check: function (event, player) {
+ return player.isTurnedOver();
+ },
+ prompt: "是否发动【酒诗】,将武将牌翻面?",
+ filter: function (event, player) {
+ if (event.jiushi) {
+ return true;
+ }
+ return false;
+ },
+ content: function () {
+ delete trigger.jiushi;
+ player.turnOver();
+ },
+ },
+ zongshi: {
+ audio: 2,
+ mod: {
+ maxHandcard: function (player, num) {
+ return num + game.countGroup();
+ },
+ },
+ },
+ zishou: {
+ audio: 2,
+ audioname: ["re_liubiao"],
+ trigger: { player: "phaseDrawBegin2" },
+ check: function (event, player) {
+ return player.countCards("h") <= (player.hasSkill("zongshi") ? player.maxHp : player.hp - 2) || player.skipList.includes("phaseUse");
+ },
+ filter: function (event, player) {
+ return !event.numFixed;
+ },
+ content: function () {
+ trigger.num += game.countGroup();
+ player.addTempSkill("zishou2");
+ },
+ ai: {
+ threaten: 1.5,
+ },
+ },
+ zishou2: {
+ mod: {
+ playerEnabled: function (card, player, target) {
+ if (player != target) return false;
+ },
+ },
+ },
+ olddanshou: {
+ audio: "danshou",
+ trigger: { source: "damageSource" },
+ //priority:9,
+ check: function (event, player) {
+ return get.attitude(player, event.player) <= 0;
+ },
+ content: function () {
+ "step 0";
+ player.draw();
+ var cards = Array.from(ui.ordering.childNodes);
+ while (cards.length) {
+ cards.shift().discard();
+ }
+ "step 1";
+ var evt = _status.event.getParent("phase");
+ if (evt) {
+ game.resetSkills();
+ _status.event = evt;
+ _status.event.finish();
+ _status.event.untrigger(true);
+ }
+ },
+ ai: {
+ jueqing: true,
+ },
+ },
+ danshou: {
+ enable: "phaseUse",
+ filterCard: true,
+ position: "he",
+ audio: 2,
+ filter: function (event, player) {
+ var num = player.getStat().skill.danshou;
+ if (num) {
+ num++;
+ } else {
+ num = 1;
+ }
+ return player.countCards("he") >= num;
+ },
+ check: function (card) {
+ if (ui.selected.cards.length >= 2) {
+ return 4 - get.value(card);
+ }
+ return 6 - get.value(card);
+ },
+ selectCard: function (card) {
+ var num = _status.event.player.getStat().skill.danshou;
+ if (num) return num + 1;
+ return 1;
+ },
+ filterTarget: function (card, player, target) {
+ if (player == target) return false;
+ var num = player.getStat().skill.danshou;
+ if (num) {
+ num++;
+ } else {
+ num = 1;
+ }
+ if (num <= 2 && !target.countCards("he")) return false;
+ return player.inRange(target);
+ },
+ content: function () {
+ "step 0";
+ var num = player.getStat().skill.danshou;
+ switch (num) {
+ case 1:
+ player.discardPlayerCard(target, true);
+ break;
+ case 2:
+ target.chooseCard("选择一张牌交给" + get.translation(player), "he", true);
+ break;
+ case 3:
+ target.damage("nocard");
+ break;
+ default:
+ game.asyncDraw([player, target], 2);
+ }
+ if (num != 2) event.finish();
+ "step 1";
+ if (result.cards) {
+ target.give(result.cards, player);
+ }
+ },
+ ai: {
+ order: 8.6,
+ result: {
+ target: function (player, target) {
+ var num = player.getStat().skill.danshou;
+ if (num) {
+ num++;
+ } else {
+ num = 1;
+ }
+ if (num > 3) return 0;
+ if (num == 3) return get.damageEffect(target, player, target);
+ return -1;
+ },
+ },
+ },
+ },
+ qice: {
+ audio: 2,
+ audioname: ["clan_xunyou"],
+ enable: "phaseUse",
+ filter: function (event, player) {
+ const hs = player.getCards("h");
+ if (!hs.length) return false;
+ if (
+ hs.some(card => {
+ const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
+ return mod2 === false;
+ })
+ )
+ return false;
+ return lib.inpile.some(name => {
+ if (get.type(name) != "trick") return false;
+ const card = get.autoViewAs({ name }, hs);
+ return event.filterCard(card, player, event);
+ });
+ },
+ usable: 1,
+ chooseButton: {
+ dialog: function (player) {
+ var list = [];
+ for (var i = 0; i < lib.inpile.length; i++) {
+ if (get.type(lib.inpile[i]) == "trick") list.push(["锦囊", "", lib.inpile[i]]);
+ }
+ return ui.create.dialog(get.translation("qice"), [list, "vcard"]);
+ },
+ filter: function (button, player) {
+ const event = _status.event.getParent(),
+ card = get.autoViewAs(
+ {
+ name: button.link[2],
+ },
+ player.getCards("h")
+ );
+ return event.filterCard(card, player, event);
+ },
+ check: function (button) {
+ var player = _status.event.player;
+ var recover = 0,
+ lose = 1,
+ players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (players[i].hp == 1 && get.damageEffect(players[i], player, player) > 0 && !players[i].hasSha()) {
+ return button.link[2] == "juedou" ? 2 : -1;
+ }
+ if (!players[i].isOut()) {
+ if (players[i].hp < players[i].maxHp) {
+ if (get.attitude(player, players[i]) > 0) {
+ if (players[i].hp < 2) {
+ lose--;
+ recover += 0.5;
+ }
+ lose--;
+ recover++;
+ } else if (get.attitude(player, players[i]) < 0) {
+ if (players[i].hp < 2) {
+ lose++;
+ recover -= 0.5;
+ }
+ lose++;
+ recover--;
+ }
+ } else {
+ if (get.attitude(player, players[i]) > 0) {
+ lose--;
+ } else if (get.attitude(player, players[i]) < 0) {
+ lose++;
+ }
+ }
+ }
+ }
+ if (lose > recover && lose > 0) return button.link[2] == "nanman" ? 1 : -1;
+ if (lose < recover && recover > 0) return button.link[2] == "taoyuan" ? 1 : -1;
+ return button.link[2] == "wuzhong" ? 1 : -1;
+ },
+ backup: function (links, player) {
+ return {
+ audio: "qice",
+ audioname: ["clan_xunyou"],
+ filterCard: true,
+ selectCard: -1,
+ position: "h",
+ popname: true,
+ viewAs: { name: links[0][2] },
+ };
+ },
+ prompt: function (links, player) {
+ return "将全部手牌当作" + get.translation(links[0][2]) + "使用";
+ },
+ },
+ ai: {
+ order: 1,
+ result: {
+ player: function (player) {
+ var num = 0;
+ var cards = player.getCards("h");
+ if (cards.length >= 3 && player.hp >= 3) return 0;
+ for (var i = 0; i < cards.length; i++) {
+ num += Math.max(0, get.value(cards[i], player, "raw"));
+ }
+ num /= cards.length;
+ num *= Math.min(cards.length, player.hp);
+ return 12 - num;
+ },
+ },
+ nokeep: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (tag === "nokeep") return (!arg || (arg.card && get.name(arg.card) === "tao")) && player.isPhaseUsing() && !player.getStat("skill").qice && player.hasCard(card => get.name(card) != "tao", "h");
+ },
+ threaten: 1.6,
+ },
+ },
+ zhiyu: {
+ audio: 2,
+ trigger: { player: "damageEnd" },
+ preHidden: true,
+ content: function () {
+ "step 0";
+ player.draw();
+ "step 1";
+ if (!player.countCards("h")) event.finish();
+ else player.showHandcards();
+ "step 2";
+ if (!trigger.source) return;
+ var cards = player.getCards("h");
+ var color = get.color(cards[0], player);
+ for (var i = 1; i < cards.length; i++) {
+ if (get.color(cards[i], player) != color) return;
+ }
+ trigger.source.chooseToDiscard(true);
+ },
+ ai: {
+ maixie_defend: true,
+ threaten: 0.9,
+ },
+ },
+ xuanfeng: {
+ audio: 2,
+ audioname: ["boss_lvbu3", "re_heqi"],
+ trigger: {
+ player: ["loseAfter", "phaseDiscardEnd"],
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ direct: true,
+ filter: function (event, player) {
+ if (event.name == "phaseDiscard") {
+ var cards = [];
+ player.getHistory("lose", function (evt) {
+ if (evt && evt.type == "discard" && evt.getParent("phaseDiscard") == event && evt.hs) cards.addArray(evt.hs);
+ });
+ return cards.length > 1;
+ } else {
+ var evt = event.getl(player);
+ return evt && evt.es && evt.es.length > 0;
+ }
+ },
+ content: function () {
+ "step 0";
+ event.count = 2;
+ event.logged = false;
+ "step 1";
+ player
+ .chooseTarget(get.prompt("xuanfeng"), "弃置一名其他角色的一张牌", function (card, player, target) {
+ if (player == target) return false;
+ return target.countDiscardableCards(player, "he");
+ })
+ .set("ai", function (target) {
+ return -get.attitude(_status.event.player, target);
+ });
+ "step 2";
+ if (result.bool) {
+ if (!event.logged) {
+ player.logSkill("xuanfeng", result.targets);
+ event.logged = true;
+ } else player.line(result.targets[0], "green");
+ player.discardPlayerCard(result.targets[0], "he", true);
+ event.count--;
+ } else event.finish();
+ "step 3";
+ if (event.count) event.goto(1);
+ },
+ ai: {
+ effect: {
+ target: function (card, player, target, current) {
+ if (get.type(card) == "equip" && !get.cardtag(card, "gifts")) return [1, 3];
+ },
+ },
+ reverseEquip: true,
+ noe: true,
+ },
+ },
+ jiangchi: {
+ audio: 2,
+ trigger: { player: "phaseDrawBegin2" },
+ direct: true,
+ filter: function (event, player) {
+ return !event.numFixed;
+ },
+ content: function () {
+ "step 0";
+ player.chooseControl("jiangchi_less", "jiangchi_more", "cancel2", function () {
+ var player = _status.event.player;
+ if (player.countCards("h") > 3 && player.countCards("h", "sha") > 1) {
+ return "jiangchi_less";
+ }
+ if (player.countCards("h", "sha") > 2) {
+ return "jiangchi_less";
+ }
+ if (player.hp - player.countCards("h") > 1) {
+ return "jiangchi_more";
+ }
+ return "cancel2";
+ });
+ "step 1";
+ if (result.control == "jiangchi_less") {
+ trigger.num--;
+ player.addTempSkill("jiangchi2", "phaseUseEnd");
+ player.logSkill("jiangchi");
+ } else if (result.control == "jiangchi_more") {
+ trigger.num++;
+ player.addTempSkill("jiangchi3", "phaseUseEnd");
+ player.logSkill("jiangchi");
+ }
+ },
+ },
+ jiangchi2: {
+ mod: {
+ targetInRange: function (card, player, target, now) {
+ if (card.name == "sha") return true;
+ },
+ cardUsable: function (card, player, num) {
+ if (card.name == "sha") return num + 1;
+ },
+ },
+ },
+ jiangchi3: {
+ mod: {
+ cardEnabled: function (card) {
+ if (card.name == "sha") return false;
+ },
+ },
+ },
+ xinzhan: {
+ audio: 2,
+ enable: "phaseUse",
+ filter: function (event, player) {
+ return player.countCards("h") > player.maxHp;
+ },
+ usable: 1,
+ content: function () {
+ "step 0";
+ var cards = get.cards(3);
+ event.cards = cards;
+ var next = player.chooseCardButton(cards, "选择获得的红桃牌", [1, Infinity]).set("filterButton", function (button) {
+ return get.suit(button.link) == "heart";
+ });
+ "step 1";
+ if (result.bool) {
+ player.gain(result.links, "draw");
+ }
+ for (var i = event.cards.length - 1; i >= 0; i--) {
+ if (!result.bool || !result.links.includes(event.cards[i])) {
+ ui.cardPile.insertBefore(event.cards[i], ui.cardPile.firstChild);
+ }
+ }
+ },
+ ai: {
+ order: 11,
+ result: {
+ player: 1,
+ },
+ },
+ },
+ huilei: {
+ audio: 2,
+ trigger: { player: "die" },
+ forced: true,
+ forceDie: true,
+ filter: function (event) {
+ return event.source && event.source.isIn();
+ },
+ logTarget: "source",
+ skillAnimation: true,
+ animationColor: "thunder",
+ content: function () {
+ trigger.source.discard(trigger.source.getCards("he"));
+ },
+ ai: {
+ threaten: 0.7,
+ },
+ },
+ xinenyuan: {
+ audio: 2,
+ group: ["xinenyuan1", "xinenyuan2"],
+ },
+ xinenyuan1: {
+ audio: true,
+ trigger: { player: "gainEnd" },
+ filter: function (event, player) {
+ return event.source && event.source.isIn() && event.source != player && event.cards.length >= 2;
+ },
+ logTarget: "source",
+ check: function (event, player) {
+ return get.attitude(player, event.source) > 0;
+ },
+ prompt2: function (event, player) {
+ return "令" + get.translation(event.source) + "摸一张牌";
+ },
+ content: function () {
+ trigger.source.draw();
+ },
+ },
+ xinenyuan2: {
+ audio: true,
+ trigger: { player: "damageEnd" },
+ check: function (event, player) {
+ var att = get.attitude(player, event.source);
+ var num = event.source.countCards("h");
+ if (att <= 0) return true;
+ if (num > 2) return true;
+ if (num) return att < 4;
+ return false;
+ },
+ filter: function (event, player) {
+ return event.source && event.source != player && event.num > 0 && event.source.isIn();
+ },
+ logTarget: "source",
+ prompt2: function (event, player) {
+ return "令" + get.translation(event.source) + "交给你一张手牌或失去1点体力";
+ },
+ content: function () {
+ "step 0";
+ event.num = trigger.num;
+ "step 1";
+ trigger.source.chooseCard("选择一张手牌交给" + get.translation(player) + ",或点“取消”失去1点体力").set("ai", function (card) {
+ var player = _status.event.getParent().player,
+ source = _status.event.player;
+ if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0;
+ if (get.attitude(player, source) > 0) return 11 - get.value(card);
+ return 7 - get.value(card);
+ });
+ "step 2";
+ if (result.bool) {
+ trigger.source.give(result.cards, player);
+ } else {
+ trigger.source.loseHp();
+ }
+ if (event.num > 1 && player.hasSkill("xinenyuan") && trigger.source && trigger.source.isIn()) {
+ player.logSkill("xinenyuan", trigger.source);
+ event.num--;
+ event.goto(1);
+ }
+ },
+ ai: {
+ maixie_defend: true,
+ effect: {
+ target: function (card, player, target) {
+ if (player.hasSkillTag("jueqing", false, target)) return [1, -1.5];
+ if (!target.hasFriend()) return;
+ if (get.tag(card, "damage")) return [1, 0, 0, -0.7];
+ },
+ },
+ },
+ },
+ enyuan: {
+ audio: 2,
+ locked: true,
+ group: ["enyuan1", "enyuan2"],
+ },
+ enyuan1: {
+ audio: true,
+ trigger: { player: "damageEnd" },
+ forced: true,
+ filter: function (event, player) {
+ return event.source && event.source != player && event.source.isIn();
+ },
+ logTarget: "source",
+ content: function () {
+ "step 0";
+ trigger.source
+ .chooseCard("选择一张红桃牌交给" + get.translation(player) + ",或点“取消”失去1点体力", function (card) {
+ return get.suit(card) == "heart";
+ })
+ .set("ai", function (card) {
+ var player = _status.event.getParent().player,
+ source = _status.event.player;
+ if (get.effect(source, { name: "losehp" }, source, source) >= 0) return 0;
+ if (get.attitude(player, source) > 0) return 11 - get.value(card);
+ return 7 - get.value(card);
+ });
+ "step 1";
+ if (result.bool) {
+ trigger.source.give(result.cards, player);
+ } else {
+ trigger.source.loseHp();
+ }
+ },
+ ai: {
+ maixie_defend: true,
+ effect: {
+ target: function (card, player, target) {
+ if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
+ if (!target.hasFriend()) return;
+ if (get.tag(card, "damage")) return [1, 0, 0, -1];
+ },
+ },
+ },
+ },
+ enyuan2: {
+ audio: true,
+ trigger: { player: "recoverEnd" },
+ forced: true,
+ logTarget: "source",
+ filter: function (event, player) {
+ return event.source && event.source != player && event.source.isIn();
+ },
+ content: function () {
+ "step 0";
+ event.num = trigger.num;
+ "step 1";
+ if (event.num > 0) {
+ player.logSkill("enyuan1", trigger.source);
+ trigger.source.draw();
+ event.num--;
+ event.redo();
+ }
+ },
+ },
+ xuanhuo: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ discard: false,
+ lose: false,
+ delay: 0,
+ filter: function (event, player) {
+ return player.countCards("he", { suit: "heart" });
+ },
+ filterCard: function (card) {
+ return get.suit(card) == "heart";
+ },
+ filterTarget: function (card, player, target) {
+ if (game.countPlayer() == 2) return false;
+ return player != target;
+ },
+ check: function (card) {
+ var player = get.owner(card);
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (players[i] != player && get.attitude(player, players[i]) > 3) break;
+ }
+ if (i == players.length) return -1;
+ return 5 - get.value(card);
+ },
+ content: function () {
+ "step 0";
+ player.give(cards, target);
+ // game.delay();
+ "step 1";
+ player.gainPlayerCard(target, "he", true);
+ "step 2";
+ var source = target;
+ event.card = result.links[0];
+ if (player.getCards("h").includes(event.card))
+ player
+ .chooseTarget("将" + get.translation(event.card) + "交给另一名其他角色", function (card, player, target) {
+ return target != _status.event.sourcex && target != player;
+ })
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ })
+ .set("sourcex", target);
+ else event.finish();
+ "step 3";
+ if (result.bool) {
+ player.give(card, result.targets[0], "give");
+ game.delay();
+ }
+ },
+ ai: {
+ result: {
+ target: -0.5,
+ },
+ basic: {
+ order: 9,
+ },
+ },
+ },
+ ganlu: {
+ enable: "phaseUse",
+ usable: 1,
+ audio: 2,
+ selectTarget: 2,
+ filterTarget: function (card, player, target) {
+ if (target.isMin()) return false;
+ if (ui.selected.targets.length == 0) return true;
+ if (ui.selected.targets[0].countCards("e") == 0 && target.countCards("e") == 0) return false;
+ return Math.abs(ui.selected.targets[0].countCards("e") - target.countCards("e")) <= player.maxHp - player.hp;
+ },
+ multitarget: true,
+ content: function () {
+ targets[0].swapEquip(targets[1]);
+ },
+ ai: {
+ order: 10,
+ threaten: function (player, target) {
+ return 0.8 * Math.max(1 + target.maxHp - target.hp);
+ },
+ result: {
+ target: function (player, target) {
+ var list1 = [];
+ var list2 = [];
+ var num = player.maxHp - player.hp;
+ var players = game.filterPlayer();
+ for (var i = 0; i < players.length; i++) {
+ if (get.attitude(player, players[i]) > 0) list1.push(players[i]);
+ else if (get.attitude(player, players[i]) < 0) list2.push(players[i]);
+ }
+ list1.sort(function (a, b) {
+ return a.countCards("e") - b.countCards("e");
+ });
+ list2.sort(function (a, b) {
+ return b.countCards("e") - a.countCards("e");
+ });
+ var delta;
+ for (var i = 0; i < list1.length; i++) {
+ for (var j = 0; j < list2.length; j++) {
+ delta = list2[j].countCards("e") - list1[i].countCards("e");
+ if (delta <= 0) continue;
+ if (delta <= num) {
+ if (target == list1[i] || target == list2[j]) {
+ return get.attitude(player, target);
+ }
+ return 0;
+ }
+ }
+ }
+ return 0;
+ },
+ },
+ effect: {
+ target: function (card, player, target) {
+ if (target.hp == target.maxHp && get.tag(card, "damage")) return 0.2;
+ },
+ },
+ },
+ },
+ buyi: {
+ trigger: { global: "dying" },
+ //priority:6,
+ audio: 2,
+ audioname: ["re_wuguotai"],
+ filter: function (event, player) {
+ return event.player.hp <= 0 && event.player.countCards("h") > 0;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var check;
+ if (trigger.player.isUnderControl(true, player)) {
+ check = player.hasCard(function (card) {
+ return get.type(card) != "basic";
+ });
+ } else {
+ check = get.attitude(player, trigger.player) > 0;
+ }
+ player
+ .choosePlayerCard(trigger.player, get.prompt("buyi", trigger.player), "h")
+ .set("ai", function (button) {
+ if (!_status.event.check) return 0;
+ if (_status.event.target.isUnderControl(true, _status.event.player)) {
+ if (get.type(button.link) != "basic") {
+ return 10 - get.value(button.link);
+ }
+ return 0;
+ } else {
+ return Math.random();
+ }
+ })
+ .set("check", check)
+ .set("filterButton", function (button) {
+ if (_status.event.player == _status.event.target) {
+ return lib.filter.cardDiscardable(button.link, _status.event.player);
+ }
+ return true;
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("buyi", trigger.player);
+ event.card = result.links[0];
+ player.showCards([event.card], get.translation(player) + "展示的手牌");
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (get.type(event.card) != "basic") {
+ trigger.player.recover();
+ trigger.player.discard(event.card);
+ }
+ },
+ ai: {
+ threaten: 1.4,
+ },
+ },
+ pojun: {
+ audio: 2,
+ trigger: { source: "damageSource" },
+ check: function (event, player) {
+ if (event.player.isTurnedOver()) return get.attitude(player, event.player) > 0;
+ if (event.player.hp < 3) {
+ return get.attitude(player, event.player) < 0;
+ }
+ return get.attitude(player, event.player) > 0;
+ },
+ filter: function (event) {
+ if (event._notrigger.includes(event.player)) return false;
+ return event.card && event.card.name == "sha" && event.player.isIn();
+ },
+ logTarget: "player",
+ content: function () {
+ "step 0";
+ trigger.player.draw(Math.min(5, trigger.player.hp));
+ "step 1";
+ trigger.player.turnOver();
+ },
+ },
+ jingce: {
+ trigger: { player: "phaseUseEnd" },
+ frequent: true,
+ filter: function (event, player) {
+ return player.countUsed(null, true) >= player.hp;
+ },
+ content: function () {
+ player.draw(2);
+ },
+ audio: 2,
+ },
+ xinjingce: {
+ trigger: { player: "phaseJieshuBegin" },
+ frequent: true,
+ filter: function (event, player) {
+ return player.countUsed(null, true) >= player.hp;
+ },
+ content: function () {
+ player.draw(2);
+ },
+ audio: 2,
+ },
+ oldchengxiang: {
+ audio: "chengxiang",
+ inherit: "chengxiang",
+ },
+ chengxiang: {
+ trigger: { player: "damageEnd" },
+ //direct:true,
+ frequent: true,
+ audio: 2,
+ content: function () {
+ "step 0";
+ event.cards = get.cards(4);
+ game.cardsGotoOrdering(event.cards);
+ event.videoId = lib.status.videoId++;
+ game.broadcastAll(
+ function (player, id, cards, num) {
+ var str;
+ if (player == game.me && !_status.auto) {
+ str = "称象:选择任意张点数不大于" + num + "的牌";
+ } else {
+ str = "称象";
+ }
+ var dialog = ui.create.dialog(str, cards);
+ dialog.videoId = id;
+ },
+ player,
+ event.videoId,
+ event.cards,
+ event.name == "oldchengxiang" ? 12 : 13
+ );
+ event.time = get.utc();
+ game.addVideo("showCards", player, ["称象", get.cardsInfo(event.cards)]);
+ game.addVideo("delay", null, 2);
+ "step 1";
+ var next = player.chooseButton([0, 4]);
+ next.set("dialog", event.videoId);
+ next.set("filterButton", function (button) {
+ var num = 0;
+ for (var i = 0; i < ui.selected.buttons.length; i++) {
+ num += get.number(ui.selected.buttons[i].link);
+ }
+ return num + get.number(button.link) <= _status.event.maxNum;
+ });
+ next.set("maxNum", event.name == "oldchengxiang" ? 12 : 13);
+ next.set("ai", function (button) {
+ let player = _status.event.player,
+ name = get.name(button.link),
+ val = get.value(button.link, player);
+ if (name === "tao") return val + 2 * Math.min(3, 1 + player.getDamagedHp());
+ if (name === "jiu" && player.hp < 3) return val + 2 * (2.8 - player.hp);
+ if (name === "wuxie" && player.countCards("j") && !player.hasWuxie()) return val + 5;
+ if (player.hp > 1 && player.hasSkill("renxin") && player.hasFriend() && get.type(button.link) === "equip") return val + 4;
+ return val;
+ });
+ "step 2";
+ if (result.bool && result.links) {
+ //player.logSkill('chengxiang');
+ var cards2 = [];
+ for (var i = 0; i < result.links.length; i++) {
+ cards2.push(result.links[i]);
+ cards.remove(result.links[i]);
+ }
+ event.cards2 = cards2;
+ } else {
+ event.finish();
+ }
+ var time = 1000 - (get.utc() - event.time);
+ if (time > 0) {
+ game.delay(0, time);
+ }
+ "step 3";
+ game.broadcastAll("closeDialog", event.videoId);
+ var cards2 = event.cards2;
+ player.gain(cards2, "log", "gain2");
+ },
+ ai: {
+ maixie: true,
+ maixie_hp: true,
+ effect: {
+ target: function (card, player, target) {
+ if (get.tag(card, "damage")) {
+ if (player.hasSkillTag("jueqing", false, target)) return [1, -2];
+ if (!target.hasFriend()) return;
+ if (target.hp >= 4) return [1, 2];
+ if (target.hp == 3) return [1, 1.5];
+ if (target.hp == 2) return [1, 0.5];
+ }
+ },
+ },
+ },
+ },
+ oldrenxin: {
+ audio: "renxin",
+ trigger: { global: "dying" },
+ //priority:6,
+ filter: function (event, player) {
+ return event.player != player && event.player.hp <= 0 && player.countCards("h") > 0;
+ },
+ check: function (event, player) {
+ if (get.attitude(player, event.player) <= 0) return false;
+ if (player.countCards("h", { name: ["tao", "jiu"] }) + event.player.hp < 0) return false;
+ return true;
+ },
+ content: function () {
+ "step 0";
+ player.turnOver();
+ "step 1";
+ player.give(player.getCards("h"), trigger.player);
+ "step 2";
+ trigger.player.recover();
+ },
+ },
+ renxin: {
+ trigger: { global: "damageBegin4" },
+ audio: 2,
+ audioname: ["re_caochong"],
+ //priority:6,
+ filter: function (event, player) {
+ return event.player != player && event.player.hp == 1 && player.countCards("he", { type: "equip" }) > 0;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var next = player.chooseToDiscard(get.prompt("renxin", trigger.player), "弃置一张装备牌并将武将牌翻面,然后防止" + get.translation(trigger.player) + "受到的伤害", { type: "equip" }, "he");
+ next.logSkill = ["renxin", trigger.player];
+ next.set("ai", function (card) {
+ var player = _status.event.player;
+ if (get.attitude(player, _status.event.getTrigger().player) > 3) {
+ return 11 - get.value(card);
+ }
+ return -1;
+ });
+ "step 1";
+ if (result.bool) {
+ player.turnOver();
+ } else {
+ event.finish();
+ }
+ "step 2";
+ trigger.cancel();
+ },
+ ai: {
+ expose: 0.5,
+ },
+ },
+ yuce: {
+ audio: 2,
+ audioname: ["re_manchong"],
+ trigger: { player: "damageEnd" },
+ direct: true,
+ filter: function (event, player) {
+ return player.countCards("h") > 0 && player.isDamaged();
+ },
+ content: function () {
+ "step 0";
+ var next = player.chooseCard(get.prompt2("yuce"));
+ next.set("ai", function (card) {
+ if (get.type(card) == "basic") return 1;
+ return Math.abs(get.value(card)) + 1;
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("yuce");
+ player.showCards(result.cards);
+ var type = get.type(result.cards[0], "trick");
+ if (trigger.source) {
+ trigger.source
+ .chooseToDiscard("弃置一张不为" + get.translation(type) + "牌的牌或令" + get.translation(player) + "回复1点体力", function (card) {
+ return get.type(card, "trick") != _status.event.type;
+ })
+ .set("ai", function (card) {
+ if (get.recoverEffect(_status.event.getParent().player, _status.event.player, _status.event.player) < 0) {
+ return 7 - get.value(card);
+ }
+ return 0;
+ })
+ .set("type", type);
+ } else {
+ event.recover = true;
+ }
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (event.recover) {
+ player.recover();
+ } else if (result.bool) {
+ //player.draw();
+ } else {
+ player.recover();
+ }
+ },
+ ai: {
+ effect: {
+ target: function (card, player, target) {
+ if (get.tag(card, "damage" && target.countCards("h"))) {
+ return 0.8;
+ }
+ },
+ },
+ },
+ },
+ xiansi: {
+ audio: 2,
+ audioname: ["re_liufeng"],
+ trigger: { player: "phaseZhunbeiBegin" },
+ direct: true,
+ content: function () {
+ "step 0";
+ player.chooseTarget(
+ get.prompt2(event.name),
+ [1, 2],
+ function (card, player, target) {
+ return target.countCards("he") > 0;
+ },
+ function (target) {
+ return -get.attitude(_status.event.player, target);
+ }
+ );
+ "step 1";
+ if (result.bool) {
+ result.targets.sortBySeat();
+ player.logSkill(event.name, result.targets);
+ event.targets = result.targets;
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (event.targets.length) {
+ var target = event.targets.shift();
+ event.current = target;
+ player.choosePlayerCard(target, true);
+ } else {
+ event.finish();
+ }
+ "step 3";
+ if (result.bool) {
+ player.addToExpansion(result.cards, event.current, "give").gaintag.add("xiansi");
+ event.goto(2);
+ }
+ },
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ onremove: function (player) {
+ var cards = player.getExpansions("xiansi");
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ ai: {
+ threaten: 2,
+ },
+ global: "xiansi2",
+ group: "xiansix",
+ },
+ xiansix: {},
+ xiansi2: {
+ enable: "chooseToUse",
+ audio: 2,
+ audioname2: { re_liufeng: "rexiansi" },
+ viewAs: { name: "sha", isCard: true },
+ filter: function (event, player) {
+ return game.hasPlayer(function (current) {
+ return current.hasSkill("xiansix") && current.getExpansions("xiansi").length > 1 && event.filterTarget({ name: "sha" }, player, current);
+ });
+ },
+ filterTarget: function (card, player, target) {
+ var bool = false;
+ var players = ui.selected.targets.slice(0);
+ for (var i = 0; i < players.length; i++) {
+ if (players[i].hasSkill("xiansix") && players[i].getExpansions("xiansi").length > 1) bool = true;
+ break;
+ }
+ if (!bool && (!target.hasSkill("xiansix") || target.getExpansions("xiansi").length <= 1)) return false;
+ return _status.event._backup.filterTarget.apply(this, arguments);
+ },
+ complexSelect: true,
+ selectCard: -1,
+ filterCard: function () {
+ return false;
+ },
+ forceaudio: true,
+ prompt: "弃置一名有【逆】的角色的两张【逆】,然后视为对包含其在内的角色使用【杀】。",
+ delay: false,
+ log: false,
+ precontent: function () {
+ "step 0";
+ var targets = event.result.targets.filter(function (current) {
+ return current.getExpansions("xiansi").length > 1 && current.hasSkill("xiansix");
+ });
+ if (targets.length == 1) {
+ event.target = targets[0];
+ event.goto(2);
+ } else if (targets.length > 0) {
+ player
+ .chooseTarget(true, "选择弃置【陷嗣】牌的目标", function (card, player, target) {
+ return _status.event.list.includes(target);
+ })
+ .set("list", targets)
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.attitude(player, target);
+ });
+ } else {
+ event.finish();
+ }
+ "step 1";
+ if (result.bool && result.targets.length) {
+ event.target = result.targets[0];
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (event.target) {
+ if (event.target.getExpansions("xiansi").length == 2) {
+ event.directresult = event.target.getExpansions("xiansi").slice(0);
+ } else {
+ player.chooseCardButton("移去两张“逆”", 2, event.target.getExpansions("xiansi"), true);
+ }
+ } else {
+ event.finish();
+ }
+ "step 3";
+ if (event.directresult || result.bool) {
+ player.logSkill("xiansi2_log", event.target);
+ game.trySkillAudio("xiansi2", event.target, true);
+ var links = event.directresult || result.links;
+ target.loseToDiscardpile(links);
+ }
+ },
+ ai: {
+ order: function () {
+ return get.order({ name: "sha" }) + 0.05;
+ },
+ },
+ subSkill: { log: {} },
+ },
+ shibei: {
+ trigger: { player: "damageEnd" },
+ forced: true,
+ audio: 2,
+ audioname: ["xin_jushou"],
+ check: function (event, player) {
+ return player.getHistory("damage").indexOf(event) == 0;
+ },
+ content: function () {
+ if (player.getHistory("damage").indexOf(trigger) > 0) {
+ player.loseHp();
+ } else {
+ player.recover();
+ }
+ },
+ subSkill: {
+ damaged: {},
+ ai: {},
+ },
+ ai: {
+ maixie_defend: true,
+ threaten: 0.9,
+ effect: {
+ target: function (card, player, target) {
+ if (player.hasSkillTag("jueqing")) return;
+ if (target.hujia) return;
+ if (player._shibei_tmp) return;
+ if (target.hasSkill("shibei_ai")) return;
+ if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return;
+ if (get.tag(card, "damage")) {
+ if (target.getHistory("damage").length > 0) {
+ return [1, -2];
+ } else {
+ if (get.attitude(player, target) > 0 && target.hp > 1) {
+ return 0;
+ }
+ if (get.attitude(player, target) < 0 && !player.hasSkillTag("damageBonus")) {
+ if (card.name == "sha") return;
+ var sha = false;
+ player._shibei_tmp = true;
+ var num = player.countCards("h", function (card) {
+ if (card.name == "sha") {
+ if (sha) {
+ return false;
+ } else {
+ sha = true;
+ }
+ }
+ return get.tag(card, "damage") && player.canUse(card, target) && get.effect(target, card, player, player) > 0;
+ });
+ delete player._shibei_tmp;
+ if (player.hasSkillTag("damage")) {
+ num++;
+ }
+ if (num < 2) {
+ var enemies = player.getEnemies();
+ if (enemies.length == 1 && enemies[0] == target && player.needsToDiscard()) {
+ return;
+ }
+ return 0;
+ }
+ }
+ }
+ }
+ },
+ },
+ },
+ },
+ shibei_old: {
+ audio: 2,
+ trigger: { player: "damageAfter" },
+ forced: true,
+ content: function () {
+ "step 0";
+ player.judge(function (card) {
+ if (player.hasSkill("shibei2")) {
+ if (get.color(card) == "black") return -1;
+ } else {
+ if (get.color(card) == "red") return 1;
+ }
+ return 0;
+ });
+ "step 1";
+ if (result.judge > 0) {
+ player.recover();
+ } else if (result.judge < 0) {
+ player.loseHp();
+ }
+ if (!player.hasSkill("shibei2")) {
+ player.addTempSkill("shibei2");
+ }
+ },
+ },
+ shibei2: {},
+ jianying: {
+ audio: 2,
+ locked: false,
+ mod: {
+ aiOrder: function (player, card, num) {
+ if (typeof card == "object" && player.isPhaseUsing()) {
+ var evt = player.getLastUsed();
+ if (evt && evt.card && ((get.suit(evt.card) && get.suit(evt.card) == get.suit(card)) || (evt.card.number && evt.card.number == get.number(card)))) {
+ return num + 10;
+ }
+ }
+ },
+ },
+ trigger: { player: "useCard" },
+ frequent: true,
+ filter: function (event, player) {
+ var evt = player.getLastUsed(1);
+ if (!evt || !evt.card) return false;
+ if (!player.isPhaseUsing()) return false;
+ var evt2 = evt.getParent("phaseUse");
+ if (!evt2 || evt2.name != "phaseUse" || evt2.player != player) return false;
+ return (get.suit(evt.card) != "none" && get.suit(evt.card) == get.suit(event.card)) || (typeof get.number(evt.card, false) == "number" && get.number(evt.card, false) == get.number(event.card));
+ },
+ content: function () {
+ player.draw();
+ },
+ group: "jianying_mark",
+ init: function (player) {
+ if (player.isPhaseUsing()) {
+ var evt = _status.event.getParent("phaseUse");
+ var history = player.getHistory("useCard", function (evt2) {
+ return evt2.getParent("phaseUse") == evt;
+ });
+ if (history.length) {
+ var trigger = history[history.length - 1];
+ if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") return;
+ player.storage.jianying_mark = trigger.card;
+ player.markSkill("jianying_mark");
+ game.broadcastAll(
+ function (player, suit) {
+ if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit);
+ },
+ player,
+ get.suit(trigger.card, player)
+ );
+ player.when("phaseUseAfter").then(() => {
+ player.unmarkSkill("jianying_mark");
+ delete player.storage.jianying_mark;
+ });
+ }
+ }
+ },
+ onremove: function (player) {
+ player.unmarkSkill("jianying_mark");
+ delete player.storage.jianying_mark;
+ },
+ subSkill: {
+ mark: {
+ charlotte: true,
+ trigger: { player: "useCard1" },
+ filter: function (event, player) {
+ return player.isPhaseUsing();
+ },
+ forced: true,
+ popup: false,
+ firstDo: true,
+ content: function () {
+ if (get.suit(trigger.card, player) == "none" || typeof get.number(trigger.card, player) != "number") player.unmarkSkill("jianying_mark");
+ else {
+ player.storage.jianying_mark = trigger.card;
+ player.markSkill("jianying_mark");
+ game.broadcastAll(
+ function (player, suit) {
+ if (player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML = get.translation(suit);
+ },
+ player,
+ get.suit(trigger.card, player)
+ );
+ player.when("phaseUseAfter").then(() => {
+ player.unmarkSkill("jianying_mark");
+ delete player.storage.jianying_mark;
+ });
+ }
+ },
+ intro: {
+ markcount: function (card, player) {
+ var num = get.number(card, player);
+ var list = [1, 11, 12, 13];
+ if (list.includes(num)) return ["A", "J", "Q", "K"][list.indexOf(num)];
+ return parseFloat(num);
+ },
+ content: function (card, player) {
+ var suit = get.suit(card, player);
+ var num = get.number(card, player);
+ var str = "
上一张牌的花色:" + get.translation(suit);
+ str += "
上一张牌的点数:";
+ var list = [1, 11, 12, 13];
+ if (list.includes(num)) str += ["A(1)", "J(11)", "Q(12)", "K(13)"][list.indexOf(num)];
+ else str += parseFloat(num);
+ return str;
+ },
+ },
+ },
+ },
+ },
+ zzhenggong: {
+ trigger: { player: "damageEnd" },
+ direct: true,
+ filter: function (event, player) {
+ return event.source && event.source.countCards("e") > 0;
+ },
+ content: function () {
+ "step 0";
+ var att = get.attitude(player, trigger.source);
+ player.gainPlayerCard("e", get.prompt("zzhenggong"), trigger.source).ai = function (button) {
+ if (att <= 0) {
+ return get.equipValue(button.link);
+ }
+ return 0;
+ };
+ "step 1";
+ if (result.bool) {
+ player.logSkill("zzhenggong", trigger.source);
+ var card = result.links[0];
+ if (player.getCards("h").includes(card)) {
+ player.$give(card, player, false);
+ player.equip(card);
+ }
+ }
+ },
+ ai: {
+ maixie_defend: true,
+ },
+ },
+ zquanji: {
+ trigger: { global: "phaseBegin" },
+ //priority:15,
+ check: function (event, player) {
+ var att = get.attitude(player, event.player);
+ if (att < 0) {
+ var nh1 = event.player.countCards("h");
+ var nh2 = player.countCards("h");
+ return nh1 <= 2 && nh2 > nh1 + 1;
+ }
+ if (att > 0 && event.player.hasJudge("lebu") && event.player.countCards("h") > event.player.hp + 1) return true;
+ return false;
+ },
+ logTarget: "player",
+ filter: function (event, player) {
+ return event.player != player && player.canCompare(event.player);
+ },
+ content: function () {
+ "step 0";
+ player.chooseToCompare(trigger.player);
+ "step 1";
+ if (result.bool) {
+ trigger.player.skip("phaseZhunbei");
+ trigger.player.skip("phaseJudge");
+ }
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ zbaijiang: {
+ skillAnimation: true,
+ trigger: { player: "phaseZhunbeiBegin" },
+ forced: true,
+ unique: true,
+ derivation: ["zyexin", "zzili", "zpaiyi"],
+ filter: function (event, player) {
+ return player.countCards("e") >= 2;
+ },
+ content: function () {
+ player.awakenSkill("zbaijiang");
+ player.gainMaxHp();
+ player.changeSkills(["zyexin", "zzili"], ["zquanji", "zzhenggong"]);
+ },
+ },
+ zyexin: {
+ trigger: { player: "damageEnd", source: "damageSource" },
+ marktext: "权",
+ frequent: true,
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ content: function () {
+ player.addToExpansion("zyexin", get.cards(), "gain2").gaintag.add("zyexin");
+ },
+ group: "zyexin2",
+ },
+ zyexin2: {
+ enable: "phaseUse",
+ usable: 1,
+ lose: false,
+ discard: false,
+ delay: false,
+ selectCard: [1, Infinity],
+ filterCard: true,
+ filter: function (event, player) {
+ return player.getExpansions("zyexin").length > 0;
+ },
+ prompt: "用任意数量的手牌与等量的“权”交换",
+ content: function () {
+ "step 0";
+ player.addToExpansion(cards, "give", player).gaintag.add("zyexin");
+ "step 1";
+ player.chooseCardButton(player.getExpansions("zyexin"), "选择" + get.cnNumber(cards.length) + "张牌作为手牌", cards.length, true).ai = function (button) {
+ return get.value(button.link);
+ };
+ "step 2";
+ player.gain(result.links, "gain2");
+ },
+ ai: {
+ order: 5,
+ result: {
+ player: 1,
+ },
+ },
+ },
+ zzili: {
+ skillAnimation: true,
+ unique: true,
+ derivation: "zpaiyi",
+ trigger: { player: "phaseZhunbeiBegin" },
+ filter: function (event, player) {
+ return player.getExpansions("zyexin").length >= 4;
+ },
+ forced: true,
+ async content(e, t, player) {
+ player.awakenSkill("zzili");
+ player.loseMaxHp();
+ player.addSkills("zpaiyi");
+ },
+ // intro:{
+ // content:'limited'
+ // }
+ },
+ zpaiyi: {
+ trigger: { player: "phaseJieshuBegin" },
+ filter: function (event, player) {
+ return player.getExpansions("zyexin").length;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var next = player.chooseCardButton(get.prompt("zpaiyi"), player.getExpansions("zyexin"));
+ next.set("ai", function (button) {
+ return get.value(button.link);
+ });
+ "step 1";
+ if (result.bool) {
+ var card = result.links[0];
+ event.card = card;
+ player
+ .chooseTarget(function (card, player, target) {
+ var card = _status.event.card;
+ var type = get.type(card);
+ switch (type) {
+ case "basic":
+ case "trick":
+ return true;
+ case "delay":
+ return target.canAddJudge(card);
+ case "equip":
+ return target.canEquip(card, true);
+ }
+ return true;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.effect(target, _status.event.card, player, player);
+ })
+ .set("card", card);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool) {
+ var type = get.type(event.card),
+ target = result.targets[0];
+ player.logSkill("zpaiyi", target);
+ switch (type) {
+ case "basic":
+ case "trick":
+ player.give(event.card, target, "give");
+ break;
+ case "delay":
+ player.$give(event.card, target, false);
+ target.addJudge(event.card);
+ break;
+ case "equip":
+ player.$give(event.card, target, false);
+ target.equip(event.card);
+ }
+ if (player != result.targets[0]) {
+ player.chooseBool("是否摸一张牌?");
+ } else event.finish();
+ } else event.finish();
+ "step 3";
+ if (result.bool) player.draw();
+ },
+ ai: {
+ combo: "zyexin",
+ },
+ },
+};
+
+export default skills;
diff --git a/character/yijiang/sort.js b/character/yijiang/sort.js
new file mode 100644
index 000000000..d8dcb2459
--- /dev/null
+++ b/character/yijiang/sort.js
@@ -0,0 +1,27 @@
+const characterSort = {
+ yijiang_2011: ["caozhi", "yujin", "zhangchunhua", "xin_fazheng", "xin_masu", "xin_xushu", "xusheng", "lingtong", "wuguotai", "chengong", "gaoshun"],
+ yijiang_2012: ["wangyi", "xunyou", "zhonghui", "old_madai", "liaohua", "guanzhang", "bulianshi", "handang", "chengpu", "liubiao", "old_huaxiong", "caozhang"],
+ yijiang_2013: ["manchong", "guohuai", "caochong", "guanping", "liufeng", "jianyong", "yufan", "panzhangmazhong", "zhuran", "xin_liru", "fuhuanghou"],
+ yijiang_2014: ["hanhaoshihuan", "chenqun", "caozhen", "zhangsong", "wuyi", "zhoucang", "zhuhuan", "guyong", "sunluban", "yj_jushou", "caifuren"],
+ yijiang_2015: ["caoxiu", "caorui", "zhongyao", "xiahoushi", "liuchen", "zhangyi", "zhuzhi", "quancong", "sunxiu", "gongsunyuan", "guotufengji"],
+ yijiang_2016: ["guohuanghou", "sunziliufang", "huanghao", "liyan", "sundeng", "cenhun", "zhangrang", "liuyu"],
+ yijiang_2017: ["xinxianying", "jikang", "wuxian", "qinmi", "xuezong", "xushi", "caiyong", "caojie"],
+ yijiang_2022: ["lukai", "kebineng", "zhugeshang", "liwan", "wuanguo", "hanlong", "yj_sufei", "yj_qiaozhou"],
+ yijiang_2023: ["xiahoumao", "chenshi", "sunli", "feiyao"],
+ yijiang_2024: ["linghuyu", "yj_simafu", "yj_xuangongzhu", "xukun"],
+};
+
+const characterSortTranslate = {
+ yijiang_2011: "一将成名2011",
+ yijiang_2012: "一将成名2012",
+ yijiang_2013: "一将成名2013",
+ yijiang_2014: "一将成名2014",
+ yijiang_2015: "一将成名2015",
+ yijiang_2016: "原创设计2016",
+ yijiang_2017: "原创设计2017",
+ yijiang_2022: "原创设计2022",
+ yijiang_2023: "一将成名2023",
+ yijiang_2024: "一将成名2024",
+};
+
+export { characterSort, characterSortTranslate };
diff --git a/character/yijiang/translate.js b/character/yijiang/translate.js
new file mode 100644
index 000000000..5f9d3d14b
--- /dev/null
+++ b/character/yijiang/translate.js
@@ -0,0 +1,659 @@
+const translates = {
+ old_huaxiong: "将华雄",
+ old_huaxiong_prefix: "将",
+ yufan: "虞翻",
+ xushu: "旧徐庶",
+ xushu_prefix: "旧",
+ caozhi: "曹植",
+ zhangchunhua: "张春华",
+ lingtong: "凌统",
+ xunyou: "荀攸",
+ liubiao: "刘表",
+ zhuran: "朱然",
+ yujin: "于禁",
+ masu: "旧马谡",
+ masu_prefix: "旧",
+ xin_masu: "马谡",
+ xin_fazheng: "法正",
+ wuguotai: "吴国太",
+ chengong: "陈宫",
+ xusheng: "徐盛",
+ guohuai: "郭淮",
+ caochong: "曹冲",
+ bulianshi: "步练师",
+ handang: "韩当",
+ fuhuanghou: "伏寿",
+ caifuren: "蔡夫人",
+ zhonghui: "钟会",
+ old_zhonghui: "旧钟会",
+ old_zhonghui_prefix: "旧",
+ sunluban: "孙鲁班",
+ chenqun: "陈群",
+ zhangsong: "张松",
+ guyong: "顾雍",
+ jianyong: "简雍",
+ old_madai: "马岱",
+ gz_madai: "马岱",
+ xin_xushu: "徐庶",
+ manchong: "满宠",
+ liufeng: "刘封",
+ liru: "旧李儒",
+ liru_prefix: "旧",
+ yj_jushou: "沮授",
+ zhuhuan: "朱桓",
+ xiahoushi: "夏侯氏",
+ panzhangmazhong: "潘璋马忠",
+ caorui: "曹叡",
+ caoxiu: "曹休",
+ zhongyao: "钟繇",
+ liuchen: "刘谌",
+ zhangyi: "张嶷",
+ sunxiu: "孙休",
+ zhuzhi: "朱治",
+ quancong: "全琮",
+ gongsunyuan: "公孙渊",
+ guotufengji: "郭图逢纪",
+ zhoucang: "周仓",
+ guanping: "关平",
+ liaohua: "廖化",
+ caozhen: "曹真",
+ wuyi: "吴懿",
+ hanhaoshihuan: "韩浩史涣",
+ chengpu: "程普",
+ gaoshun: "高顺",
+ xin_liru: "李儒",
+ guohuanghou: "郭皇后",
+ liuyu: "刘虞",
+ sundeng: "孙登",
+ liyan: "李严",
+ sunziliufang: "孙资刘放",
+ huanghao: "黄皓",
+ zhangrang: "张让",
+ cenhun: "岑昏",
+ xinxianying: "辛宪英",
+ wuxian: "吴苋",
+ xushi: "徐氏",
+ caojie: "曹节",
+ xuezong: "薛综",
+ jikang: "嵇康",
+ qinmi: "秦宓",
+ caiyong: "蔡邕",
+
+ new_qingxian: "清弦",
+ new_qingxian_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)",
+ new_juexiang: "绝响",
+ new_juexiang_info: "锁定技,当你死亡后,杀死你的角色弃置装备区内的所有牌并失去1点体力。然后,你可以令一名其他角色获得技能〖残韵〗。若该角色区域内有梅花牌,则其可以弃置其中的一张,然后其获得技能〖绝响〗。",
+ new_canyun: "残韵",
+ new_canyun_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)",
+ qingxian_draw: "清弦",
+ qingxian_draw_info: "",
+ zhenjun: "镇军",
+ zhenjun_info: "准备阶段,你可以弃置一名手牌数多于体力值的角色的X张牌(X为其手牌数和体力值之差),然后选择一项:1.你弃置等同于其中非装备牌数量的牌;2.其摸等量的牌。",
+ rezhenjun: "镇军",
+ rezhenjun_info: "准备阶段,你可以弃置一名角色的X张牌(X为其手牌数和体力值之差且至少为1),然后选择一项:1.你弃置X张牌;2.其摸X张牌。(X为其弃置的牌中非装备牌的数量)",
+ fenli: "奋励",
+ fenli_info: "若你的手牌数为全场最多,你可以跳过摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。",
+ pingkou: "平寇",
+ pingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。",
+ xinanguo: "安国",
+ xinanguo_info: "出牌阶段限一次,你可以选择一名其他角色,若其手牌数为全场最少,其摸一张牌;体力值为全场最低,回复1点体力;装备区内牌数为全场最少,随机使用一张装备牌。然后若该角色有未执行的效果且你满足条件,你执行之。",
+ pindi: "品第",
+ pindi_info: "出牌阶段,你可以弃置一张牌并选择一名其他角色(不能弃置相同类型牌且不能指定相同的角色),然后令其执行一项:摸X张牌;弃置X张牌(X为本回合此技能发动次数)。若其已受伤,你横置。",
+ funan_jiexun: "诫训",
+ bizhuan: "辟撰",
+ bizhuan_bg: "书",
+ bizhuan_info: "当你使用黑桃牌后,或你成为其他角色使用黑桃牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”;你至多拥有四张“书”,你每有一张“书” ,手牌上限+1。",
+ tongbo: "通博",
+ tongbo_info: "摸牌阶段摸牌后,你可以用任意张牌替换等量的“书”,然后若你的“书”包含四种花色,你将所有“书”交给任意名其他角色。",
+ qingxian: "清弦",
+ qingxian_info: "当你受到伤害/回复体力后,你可以令伤害来源/一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你摸一张牌。",
+ juexiang: "绝响",
+ juexiang_info: "当你死亡后,你可以令一名角色随机获得“清弦残谱”其中一个技能,然后直到其下回合开始,其不能被选择为其他角色使用梅花牌的目标。",
+ juexiang_ji: "激弦",
+ juexiang_ji_info: "当你受到伤害后,你可以令伤害来源失去1点体力,随机使用一张装备。",
+ juexiang_lie: "烈弦",
+ juexiang_lie_info: "当你回复体力后,你可以令一名其他角色失去1点体力,随机使用一张装备。",
+ juexiang_rou: "柔弦",
+ juexiang_rou_info: "当你受到伤害后,你可以令伤害来源回复1点体力,弃置一张装备。",
+ juexiang_he: "和弦",
+ juexiang_he_info: "当你回复体力后,你可以令一名其他角色回复1点体力,弃置一张装备。",
+ juexiang_club: "绝响",
+ juexiang_club_bg: "响",
+ juexiang_club_info: "直到下回合开始,不能被选择为其他角色使用梅花牌的目标。",
+ jianzheng: "谏征",
+ jianzheng_info: "当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。",
+ zhuandui: "专对",
+ zhuandui_info: "当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效。",
+ zhuandui_use_info: "当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应。",
+ zhuandui_respond_info: "当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效。",
+ tianbian: "天辩",
+ tianbian_info: "你拼点时,可以改为用牌堆顶的一张牌进行拼点;当你拼点的牌亮出后,若此牌花色为红桃,则此牌的点数视为K。",
+ funan: "复难",
+ funan_info: "其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。",
+ jiexun: "诫训",
+ jiexun_info: "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你失去〖诫训〗,然后你发动〖复难〗时,无须令对方获得你使用的牌。",
+ xinjiexun: "诫训",
+ xinjiexun_info: "结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你将X归零,然后你发动〖复难〗时,无须令对方获得你使用的牌。",
+ shouxi: "守玺",
+ shouxi_info: "当你成为【杀】的目标后,你可声明一种未以此法声明过的基本牌或锦囊牌的牌名。若使用者弃置一张你声明的牌,其获得你的一张牌;若否,则此【杀】对你无效。",
+ huimin: "惠民",
+ huimin_info: "结束阶段,你可以摸X张牌并展示等量手牌(X为手牌数小于其体力值的角色数),然后从你指定的一名角色开始这些角色依次选择并获得其中一张。",
+ wengua: "问卦",
+ wengua2: "问卦",
+ wengua_info: "其他角色/你的出牌阶段限一次,其可以交给你一张牌,(若当前回合角色为你,则跳过此步骤),你可以将此牌/一张牌置于牌堆顶或牌堆底,然后你与其/你从另一端摸一张牌。",
+ fuzhu: "伏诛",
+ fuzhu_info: "一名男性角色的结束阶段,若牌堆剩余牌数不大于你体力值的十倍,则你可以依次对其使用牌堆中所有的【杀】(不能超过游戏人数),然后洗牌。",
+ fumian: "福绵",
+ fumian_info: "准备阶段,你可以选择一项:1.摸牌阶段多摸一张牌;2.使用红色牌可以多选择一个目标(限一次)。若与你上回合选择的选项不同,则该选项数值+1并复原此技能。",
+ daiyan: "怠宴",
+ daiyan_info: "结束阶段,你可以令一名其他角色从牌堆中获得一张红桃基本牌,然后若其于上回合成为过该技能目标,则其失去1点体力。",
+ xinzhongjian: "忠鉴",
+ xinzhongjian_info: "出牌阶段限一次,你可以展示自己的一张手牌,然后展示一名其他角色的至多三张手牌。其展示的牌中:每有一张花色相同,你摸一张牌;点数相同,你对其造成1点伤害;均不同,你弃置一张手牌。",
+ zhongjian: "忠鉴",
+ zhongjian_bg: "鉴",
+ zhongjian3: "忠鉴",
+ zhongjian3_bg: "鉴",
+ zhongjian_info: "出牌阶段限一次,你可以展示一张手牌,然后展示一名其他角色的X张手牌(X为其体力值)。若以此法展示的牌与你展示的牌:有颜色相同的,你选择:①摸一张牌。②弃置一名其他角色的一张牌;有点数相同的,本回合此技能改为“出牌阶段限两次”;均不同,你的手牌上限-1。",
+ caishi: "才识",
+ caishix: "才识/忠鉴",
+ caishi_info: "摸牌阶段开始时,你可以选择一项:1.令手牌上限+1;2.回复1点体力,本回合内不能对自己使用牌。",
+ xincaishi: "才识",
+ xincaishi_info: "摸牌阶段,你可以选择一项:1.少摸一张牌,然后本回合发动〖忠鉴〗时可以多展示自己的一张牌;2.本回合手牌上限-1,然后本回合发动〖忠鉴〗时可以多展示对方的一张牌;3.多摸两张牌,本回合不能发动〖忠鉴〗。",
+ guizao: "瑰藻",
+ guizao_info: "弃牌阶段结束时,若你于此阶段弃置牌的数量不小于2且它们的花色各不相同,你可以回复1点体力或摸一张牌。",
+ jiyu: "讥谀",
+ jiyu_info: "出牌阶段限一次,你可以令一名角色弃置一张手牌。若如此做,你不能使用与之相同花色的牌,直到回合结束。若其以此法弃置的牌为黑桃,你翻面并令其失去1点体力。若你有未被〖讥谀〗限制的手牌,则你可以继续发动此技能,但不能选择本回合已经选择过的目标。",
+ qinqing: "寝情",
+ qinqing_info: "结束阶段,你可以选择任意名攻击范围内含有主公的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比主公多的角色数)。",
+ qinqing_info_doudizhu: "结束阶段,你可以选择任意名攻击范围内含有地主的角色,然后弃置这些角色各一张牌并令其摸一张牌(无牌则不弃),若如此做,你摸X张牌(X为其中手牌比地主多的角色数)。",
+ huisheng: "贿生",
+ huisheng_info: "当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张,防止此伤害,然后你不能再对其发动〖贿生〗;2.弃置等量的牌。",
+ jishe: "极奢",
+ jishe2: "极奢",
+ jishe_info: "①出牌阶段限20次,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。②结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)。",
+ lianhuo: "链祸",
+ lianhuo_info: "锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1。",
+ taoluan: "滔乱",
+ taoluan_backup: "滔乱",
+ taoluan_info: "你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力且〖滔乱〗无效直到回合结束。",
+ xintaoluan: "滔乱",
+ xintaoluan_backup: "滔乱",
+ xintaoluan_info: "若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)。",
+ jiaozhao: "矫诏",
+ jiaozhao3: "矫诏",
+ jiaozhao3_backup: "矫诏",
+ jiaozhao2: "矫诏",
+ jiaozhao_info: "出牌阶段限一次,你可以展示一张手牌,然后选择距离最近的一名其他角色,该角色声明一张基本牌的牌名。在此出牌阶段内,你可以将此手牌当声明的牌使用(你不能对自己使用此牌)。",
+ danxin: "殚心",
+ danxin_info: "当你受到伤害后,你可以摸一张牌,或对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。",
+ xindanxin: "殚心",
+ xindanxin_info: "当你受到伤害后,你可以摸一张牌,并对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。3.将“出牌阶段限一次”改为“出牌阶段限两次”。",
+ duliang: "督粮",
+ duliang2: "督粮",
+ duliang_info: "出牌阶段限一次,你可以获得一名其他角色的一张手牌,然后选择一项:1.令其观看牌堆顶的两张牌,然后获得其中的基本牌;2.令其于下个摸牌阶段额外摸一张牌。",
+ fulin: "腹鳞",
+ fulin_info: "锁定技,你于回合内得到的牌不计入你本回合的手牌上限。",
+ kuangbi: "匡弼",
+ kuangbi_info: "出牌阶段限一次,你可以选择一名有牌的其他角色,该角色将其的一至三张牌置于你的武将牌上。若如此做,你的下个准备阶段,你获得武将牌上的所有牌,然后其摸等量的牌。",
+ xinzhige: "止戈",
+ xinzhige_info: "出牌阶段限一次,你可以令一名攻击范围内含有你的其他角色交给你一张【杀】或武器牌,否则其视为对你指定的另一名其攻击范围内的角色使用了一张【杀】。",
+ zhige: "止戈",
+ zhige_info: "出牌阶段限一次,若你的手牌数大于你的体力值,你可以选择攻击范围内含有你的一名其他角色,其选择一项:1.使用一张【杀】;2.将装备区里的一张牌交给你。",
+ xinzongzuo: "宗祚",
+ xinzongzuo_info: "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限并摸两张牌。",
+ zongzuo: "宗祚",
+ zongzuo_info: "锁定技,游戏的第一个回合开始前,你加X点体力上限并回复X点体力(X为全场势力数);当一名角色死亡后,若没有与其势力相同的角色,你减1点体力上限。",
+ xinjuece: "绝策",
+ xinjuece_info: "结束阶段,你可以对一名没有手牌的角色造成1点伤害。",
+ xinmieji: "灭计",
+ xinmieji_info: "出牌阶段限一次,你可以展示一张黑色锦囊牌并将之置于牌堆顶,然后令有手牌的一名其他角色选择一项:弃置一张锦囊牌;或依次弃置两张非锦囊牌。",
+ xinfencheng: "焚城",
+ xinfencheng_info: "限定技。出牌阶段,你可以令所有其他角色各选择一项:弃置至少X张牌(X为该角色的上家以此法弃置牌的数量+1);或受到你对其造成的2点火焰伤害。",
+ qianju: "千驹",
+ qianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值)。",
+ qingxi: "倾袭",
+ qingxi_info: "当你使用【杀】对目标角色造成伤害时,若你的装备区里有武器牌,你可以令其选择一项:1、弃置X张手牌(X为此武器牌的攻击范围),若如此做,其弃置你的此武器牌;2、令伤害值+1。",
+ reqianju: "千驹",
+ reqianju_info: "锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值且至少为1)。",
+ reqingxi: "倾袭",
+ reqingxi_info: "当你使用【杀】或【决斗】指定目标后,你可以令其选择一项:1、弃置X张手牌(X为你攻击范围内的角色数,且当你装备区内有武器牌/没有武器牌时至多为4/2),若如此做,其弃置你的此武器牌;2、令此牌的伤害值+1且你进行判定,若结果为红色,则其不能响应此牌。",
+ jieyue: "节钺",
+ jieyue_info: "①结束阶段,你可以弃置一张手牌,然后令一名其他角色选择一项:1.将一张牌置于你的武将牌上,称之为“节”;2.令你弃置其一张牌。②若你有“节”,你可以将红色/黑色手牌当作【闪】/【无懈可击】使用或打出。③准备阶段,若你有“节”,则你获得之。",
+ xianzhen: "陷阵",
+ xianzhen_info: "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视与该角色的距离;无视该角色的防具且对其使用【杀】没有次数限制。若你没赢,你不能使用【杀】直到回合结束。",
+ xinxianzhen: "陷阵",
+ xinxianzhen_info: "出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视该角色的防具且对其使用牌没有次数和距离限制,且当你使用【杀】或普通锦囊牌指定其他角色为唯一目标时可以令该角色也成为此牌的目标。若你没赢,你不能使用【杀】且你的【杀】不计入手牌上限直到回合结束。",
+ xinxianzhen2: "陷阵",
+ jinjiu: "禁酒",
+ jinjiu_info: "锁定技,你的【酒】均视为【杀】。",
+ chunlao: "醇醪",
+ chunlao2: "醇醪",
+ chunlao_info: "结束阶段开始时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】。",
+ lihuo: "疠火",
+ lihuo_info: "当你声明使用普通【杀】后,你可以将此【杀】改为火【杀】。若以此法使用的【杀】造成了伤害,则此【杀】结算后你失去1点体力;你使用火【杀】选择目标后,可以额外指定一个目标。",
+ shenduan: "慎断",
+ shenduan_info: "当你的黑色基本牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。",
+ yonglve: "勇略",
+ yonglve_info: "一名其他角色的判定阶段开始时,若其在你攻击范围内,则你可以弃置其判定区里的一张牌,视为对该角色使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。",
+ reshenduan: "慎断",
+ reshenduan_info: "当你的黑色基本牌或装备牌因弃置而进入弃牌堆后,你可以将其当做【兵粮寸断】使用(无距离限制)。",
+ reyonglve: "勇略",
+ reyonglve_info: "其他角色的判定阶段开始时,你可以弃置其判定区里的一张牌。然后若该角色在你攻击范围内,你摸一张牌。若其在你攻击范围外,视为你对其使用一张【杀】。",
+ benxi: "奔袭",
+ benxi_info: "锁定技,你的回合内,你每使用一次牌后,你的进攻距离+1直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标。",
+ xinbenxi: "奔袭",
+ xinbenxi_info: "锁定技,当你于回合内使用牌时,你本回合计算与其他角色的距离-1。你的回合内,若你至场上所有其他角色的距离均不大于1,则当你使用【杀】或普通锦囊牌选择唯一目标后,你选择至多两项:1.为此牌多指定一个目标;2.令此牌无视防具;3.令此牌不可被抵消;4.此牌造成伤害时摸一张牌。",
+ sidi: "司敌",
+ sidi2: "司敌",
+ sidi3: "司敌",
+ sidi_info: "①当你使用或其他角色在你的回合内使用【闪】时,你可以将牌堆顶的牌置于你的武将牌上,称为“司敌”牌。②其他角色的出牌阶段开始时,你可以移去一张“司敌”牌,令其本阶段使用【杀】的次数上限-1。",
+ xinsidi: "司敌",
+ xinsidi2: "司敌",
+ xinsidi_info: "其他角色出牌阶段开始时,你可以弃置一张与你装备区里的牌颜色相同的非基本牌,然后该角色于此阶段内不能使用和打出与此牌颜色相同的牌。此阶段结束时,若其此阶段没有使用【杀】,视为你对其使用了【杀】。",
+ dangxian: "当先",
+ dangxian_info: "锁定技,回合开始时,你执行一个额外的出牌阶段。",
+ xindangxian: "当先",
+ xindangxian_info: "锁定技,回合开始时,你执行一个额外的出牌阶段。此阶段开始时,你失去1点体力并从牌堆/弃牌堆中获得一张【杀】(若你已发动过〖伏枥〗,则可以不发动此效果)。",
+ longyin: "龙吟",
+ longyin_info: "当一名角色于其出牌阶段内使用【杀】时,你可弃置一张牌令此【杀】不计入出牌阶段使用次数,若此【杀】为红色,你摸一张牌。",
+ zhongyong: "忠勇",
+ zhongyong_info: "当你于出牌阶段内使用的【杀】被目标角色使用的【闪】抵消时,你可以将此【闪】交给除该角色外的一名角色。若获得此【闪】的角色不是你,你可以对相同的目标再使用一张【杀】。",
+ xinzhongyong: "忠勇",
+ xinzhongyong_info: "当你使用的【杀】结算完毕后,你可以将此【杀】或目标角色使用的【闪】交给一名该角色以外的其他角色,以此法得到红色牌的角色可以对你攻击范围内的角色使用一张【杀】。",
+ jigong: "急攻",
+ jigong_info: "出牌阶段开始时,你可以摸两张牌。若如此做,你本回合的手牌上限改为X(X为你此阶段造成的伤害点数之和)。",
+ shifei: "饰非",
+ shifei_info: "当你需要使用或打出【闪】时,你可以令当前回合角色摸一张牌。然后若其手牌数不为全场唯一最多,则你弃置全场手牌数最多(或之一)角色的一张牌,视为你使用或打出了一张【闪】。",
+ huaiyi: "怀异",
+ huaiyi_info: "出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。",
+ yaoming: "邀名",
+ yaoming_info: "每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张手牌;2. 令手牌数小于你的一名角色摸一张牌。",
+ xinyaoming: "邀名",
+ xinyaoming_info: "每回合每个选项限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置一名其他角色的一张手牌;2. 令一名其他角色摸一张牌;3.令一名角色弃置至多两张牌,然后摸等量的牌。",
+ anguo: "安国",
+ anguo_info: "出牌阶段限一次,你可以选择一名其他角色装备区里的一张牌,令其获得此牌。然后若该角色攻击范围内的角色数因此减少,则你摸一张牌。",
+ yanzhu: "宴诛",
+ yanzhu_info: "出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能〖宴诛〗;或弃置一张牌。",
+ xingxue: "兴学",
+ xingxue_info: "结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值,若你已失去技能〖宴诛〗,则将X改为你的体力上限)。",
+ zhaofu: "诏缚",
+ zhaofu_info: "主公技,锁定技,你距离为1的角色视为在其他吴势力角色的攻击范围内。",
+ reyanzhu: "宴诛",
+ reyanzhu2: "宴诛",
+ reyanzhu_info: "出牌阶段限一次,你可以令一名其他角色选择一项:将装备区里的所有牌交给你并令你修改〖宴诛〗和〖兴学〗,或弃置一张牌并令下一次受到的伤害+1直到其下回合开始。",
+ reyanzhu_rewrite: "宴诛·改",
+ reyanzhu_rewrite_info: "出牌阶段限一次,你可以选择一名其他角色。该角色下一次受到的伤害+1直到其下回合开始。",
+ rexingxue: "兴学",
+ rexingxue_info: "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力值)。",
+ rexingxue_rewrite: "兴学·改",
+ rexingxue_rewrite_info: "结束阶段开始时,你可以令至多X名角色各摸一张牌。然后若有手牌数大于体力值的目标角色,则这些角色各将一张牌置于牌堆顶。(X为你的体力上限)。",
+ rezhaofu: "诏缚",
+ rezhaofu_info: "主公技,锁定技,你攻击范围内的角色视为在其他吴势力角色的攻击范围内。",
+ wurong: "怃戎",
+ wurong_info: "出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌。",
+ shizhi: "矢志",
+ shizhi_info: "锁定技,当你的体力值为1时,你的【闪】均视为【杀】。",
+ zhanjue: "战绝",
+ zhanjue_info: "出牌阶段,你可以将所有手牌当作【决斗】使用。此【决斗】结算后,你与以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束。",
+ qinwang: "勤王",
+ qinwang1: "勤王",
+ qinwang2: "勤王",
+ qinwang_info: "主公技,当你需要使用或打出一张【杀】时,你可以弃置一张牌,然后视为你发动了〖激将①〗。若有角色响应,则该角色打出【杀】时摸一张牌。",
+ huomo: "活墨",
+ huomo_info: "当你需要使用一张本回合内未使用过的基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。",
+ zuoding: "佐定",
+ zuoding_info: "当其他角色于其回合内使用♠牌指定目标后,若本回合内没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌。",
+ taoxi: "讨袭",
+ taoxi2: "讨袭",
+ taoxi3: "讨袭",
+ taoxi_info: "出牌阶段限一次。当你使用牌指定一名其他角色为唯一目标后,你可以亮出其一张手牌直到回合结束,并且你于此回合内可以将此牌如手牌般使用。回合结束时,若此牌仍在该角色手牌区里,你失去1点体力。",
+ huituo: "恢拓",
+ huituo_info: "当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。",
+ mingjian: "明鉴",
+ mingjian2: "明鉴",
+ mingjian_info: "出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。",
+ xingshuai: "兴衰",
+ xingshuai_info: "主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。",
+ reduodao: "夺刀",
+ reduodao_info: "当你成为【杀】的目标后,你可以弃置一张牌。然后你获得此【杀】使用者装备区里的武器牌。",
+ reanjian: "暗箭",
+ reanjian_info: "锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此杀伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。",
+ duodao: "夺刀",
+ duodao_info: "当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌。",
+ anjian: "暗箭",
+ anjian_info: "锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1。",
+ xinpojun: "破军",
+ xinpojun2: "破军",
+ xinpojun_info: "当你于出牌阶段内使用【杀】指定一个目标后,你可以将其至多X张牌扣置于该角色的武将牌旁(X为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。",
+
+ qiaoshi: "樵拾",
+ qiaoshi_info: "其他角色的结束阶段开始时,若你的手牌数与其相等,则你可以与其各摸一张牌。",
+ yanyu: "燕语",
+ yanyu2: "燕语",
+ yanyu_info: "出牌阶段,你可以重铸【杀】。出牌阶段结束时,若你于此阶段以此法重铸了至少两张【杀】,则你可以令一名男性角色摸两张牌。",
+
+ zzhenggong: "争功",
+ zzhenggong_info: "当你受到伤害后,你可以获得伤害来源装备区里的一张牌并置入你的装备区。",
+ zquanji: "权计",
+ zquanji_info: "其他角色的回合开始时,你可以与该角色拼点。若你赢,该角色跳过准备阶段和判定阶段。",
+ zbaijiang: "拜将",
+ zbaijiang_info: "觉醒技。准备阶段,若你装备区里的牌数不少于两张,你加1点体力上限,失去〖权计〗和〖争功〗,获得〖野心〗和〖自立〗。",
+ zyexin: "野心",
+ zyexin2: "野心",
+ zyexin_info: "①当你造成或受到伤害后,你可以将牌堆顶的一张牌置于你的武将牌上,称为“权”。②出牌阶段限一次。你可以用任意数量的手牌与等量的“权”交换。",
+ zzili: "自立",
+ zzili_info: "觉醒技。准备阶段,若你的“权”数不小于4,你减1点体力上限并获得〖排异〗。",
+ zpaiyi: "排异",
+ zpaiyi_info: "结束阶段,你可以选择一张“权”,若此牌为:装备牌,你将此牌置入一名角色的装备区;延时类锦囊牌,你将此牌置入一名角色的判定区;基本牌或普通锦囊牌,你将此牌交给一名角色。然后若此牌的目标区域对应的角色不为你,你可以摸一张牌。",
+ shibei: "矢北",
+ shibei_info: "锁定技,当你受到伤害后:若此伤害是你本回合第一次受到的伤害,则你回复1点体力;否则你失去1点体力。",
+ jianying: "渐营",
+ jianying_info: "当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。",
+ xinenyuan: "恩怨",
+ xinenyuan1: "恩怨",
+ xinenyuan2: "恩怨",
+ xinenyuan_info: "当你获得一名其他角色两张或更多的牌后,你可以令其摸一张牌;当你受到1点伤害后,你可以令伤害来源选择一项:1、将一张手牌交给你;2、失去1点体力。",
+ xinxuanhuo: "眩惑",
+ xinxuanhuo_info: "摸牌阶段开始时,你可以改为令一名其他角色摸两张牌,然后该角色需对其攻击范围内你选择的另一名角色使用一张【杀】,否则你获得其两张牌。",
+ fuhun: "父魂",
+ fuhun2: "父魂",
+ fuhun_info: "你可以将两张手牌当做【杀】使用或打出;当你于出牌阶段以此法使用的【杀】造成伤害后,你获得〖武圣〗和〖咆哮〗直到回合结束。",
+ yuce: "御策",
+ yuce_info: "当你受到伤害后,你可以展示一张手牌,并令伤害来源选择一项:弃置一张与此牌类型不同的手牌,或令你回复1点体力。",
+ xiansi: "陷嗣",
+ xiansix: "陷嗣",
+ xiansi_bg: "逆",
+ xiansi2: "陷嗣",
+ xiansi_info: "准备阶段开始时,你可以将一至两名角色的各一张牌置于你的武将牌上,称为“逆”;当一名角色需要对你使用【杀】时,其可以移去两张“逆”,然后视为对你使用了一张【杀】。",
+ chanhui: "谮毁",
+ chanhui_info: "出牌阶段限一次,当你使用【杀】或黑色普通锦囊牌指定唯一目标时,你可令可以成为此牌目标的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标。",
+ rechanhui: "谮毁",
+ rechanhui_info: "当你使用【杀】或普通锦囊牌指定唯一目标时,你可令可以成为此牌目标(无距离限制)的另一名其他角色选择一项:交给你一张牌并成为此牌的使用者;或成为此牌的额外目标且你本回合内不能再次发动〖谮毁〗。",
+ jiaojin: "骄矜",
+ jiaojin_info: "当你受到男性角色造成的伤害时,你可以弃置一张装备牌,令此伤害-1。",
+ rejiaojin: "骄矜",
+ rejiaojin_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以弃置一张装备牌,令此牌对你无效并获得此牌对应的所有实体牌。若此牌的使用者为女性角色,则你令〖骄矜〗失效直到回合结束。",
+ shenxing: "慎行",
+ shenxing_info: "出牌阶段,你可以弃置两张牌,然后摸一张牌。",
+ bingyi: "秉壹",
+ bingyi_info: "结束阶段开始时,你可以展示所有手牌,若这些牌颜色均相同,则你令至多X名角色各摸一张牌(X为你的手牌数)。",
+ qiangzhi: "强识",
+ qiangzhi_draw: "强识",
+ qiangzhi_info: "出牌阶段开始时,你可以展示一名其他角色的一张手牌。若如此做,当你于此阶段内使用与此牌类别相同的牌时,你可以摸一张牌。",
+ xiantu: "献图",
+ xiantu2: "献图",
+ xiantu3: "献图",
+ xiantu_info: "一名其他角色的出牌阶段开始时,你可以摸两张牌,然后交给其两张牌。若如此做,此阶段结束时,若该角色未于此阶段内杀死过角色,则你失去1点体力。",
+ dingpin: "定品",
+ dingpin_info: "出牌阶段,你可以弃置一张手牌,然后令一名已受伤的角色判定,若结果为黑色,该角色摸X张牌(X为该角色已损失的体力值),然后你本回合不能再对其发动〖定品〗;若结果为红色,你翻面(你不能弃置本回合已弃置或使用过的类型的牌)。",
+ faen: "法恩",
+ faen_info: "当一名角色翻至正面或横置后,你可以令其摸一张牌。",
+ jyzongshi: "纵适",
+ jyzongshi_info: "当你拼点赢时,你可以获得对方此次拼点的牌;当你拼点没赢时,你可以收回你此次拼点的牌。",
+ qiaoshui: "巧说",
+ qiaoshui3: "巧说",
+ qiaoshui_info: "出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束。",
+ reqiaoshui: "巧说",
+ reqiaoshui_info: "出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你结束出牌阶段且本回合内锦囊牌不计入手牌上限。",
+ junxing: "峻刑",
+ junxing_info: "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面再摸X张牌(X为你以此法弃置的手牌数量)。",
+ xinjunxing: "峻刑",
+ xinjunxing_info: "出牌阶段限一次,你可以弃置至少一张手牌并选择一名其他角色,该角色需弃置一张与你弃置的牌类别均不同的手牌,否则其先将其武将牌翻面,然后将手牌摸至四张。",
+
+ xswuyan: "无言",
+ xinwuyan: "无言",
+ jujian: "举荐",
+ xinjujian: "举荐",
+ luoying: "落英",
+ luoying_discard: "落英",
+ luoying_judge: "落英",
+ luoying_judge_noconf: "落英·判定",
+ jiushi: "酒诗",
+ jiushi1: "酒诗",
+ jiushi2: "酒诗",
+ jiushi3: "酒诗",
+ jueqing: "绝情",
+ shangshi: "伤逝",
+ xuanfeng: "旋风",
+ zhiyu: "智愚",
+ qice: "奇策",
+ qice_backup: "奇策",
+ jiangchi: "将驰",
+ jiangchi_less: "少摸一张",
+ jiangchi_more: "多摸一张",
+ zishou: "自守",
+ zongshi: "宗室",
+ danshou: "胆守",
+ olddanshou: "胆守",
+ xindanshou: "胆守",
+ yizhong: "毅重",
+ xinzhan: "心战",
+ xinzhan_gain: "获得",
+ xinzhan_place: "牌堆顶",
+ huilei: "挥泪",
+ enyuan: "恩怨",
+ enyuan1: "恩怨",
+ enyuan2: "恩怨",
+ xuanhuo: "眩惑",
+ ganlu: "甘露",
+ buyi: "补益",
+ mingce: "明策",
+ zhichi: "智迟",
+ zhichi2: "智迟",
+ pojun: "破军",
+ jingce: "精策",
+ xinjingce: "精策",
+ chengxiang: "称象",
+ oldchengxiang: "称象",
+ renxin: "仁心",
+ oldrenxin: "仁心",
+ zhenlie: "贞烈",
+ miji: "秘计",
+ miji_tag: "已分配",
+ zhiyan: "直言",
+ zongxuan: "纵玄",
+ anxu: "安恤",
+ old_anxu: "安恤",
+ zhuiyi: "追忆",
+ gongji: "弓骑",
+ qiuyuan: "求援",
+ oldqiuyuan: "求援",
+ zhuikong: "惴恐",
+ oldzhuikong: "惴恐",
+ qieting: "窃听",
+ xianzhou: "献州",
+ quanji: "权计",
+ zili: "自立",
+ paiyi: "排异",
+ paiyi_backup: "排异",
+ sanyao: "散谣",
+ olsanyao: "散谣",
+ olsanyao_backup: "散谣",
+ zhiman: "制蛮",
+ resanyao: "散谣",
+ rezhiman: "制蛮",
+ qianxi: "潜袭",
+ qianxi2: "潜袭",
+ qianxi2_bg: "袭",
+ fuli: "伏枥",
+ xinfuli: "伏枥",
+ jiefan: "解烦",
+ juece: "绝策",
+ mieji: "灭计",
+ fencheng: "焚城",
+ youdi: "诱敌",
+ youdi_info: "结束阶段开始时,你可以令一名其他角色弃置你的一张牌,若此牌不为【杀】,你获得该角色的一张牌。",
+ fencheng_info: "限定技。出牌阶段,你可令所有其他角色依次选择一项:弃置X张牌;或受到1点火焰伤害。(X为该角色装备区里牌的数量且至少为1)",
+ mieji_info: "当你使用黑色普通锦囊牌选择目标后,若目标数为1,则你可以额外指定一个目标。",
+ juece_info: "当其他角色在你回合内失去最后的手牌后,你可以对其造成1点伤害。",
+ jiefan_info: "限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。",
+ fuli_info: "限定技,当你处于濒死状态时,你可以将体力回复至与场上势力数相同,然后翻面。",
+ xinfuli_info: "限定技,当你处于濒死状态时,可以将体力回复至X点并将手牌摸至X张(X为场上势力数)。若X大于2,你翻面。",
+ qianxi_info: "准备阶段,你可以摸一张牌,并弃置一张牌,然后令一名距离为1的角色不能使用或打出与你弃置的牌颜色相同的手牌直到回合结束。",
+ zhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其装备区或判定区的一张牌。",
+ sanyao_info: "出牌阶段限一次,你可以弃置一张牌并指定一名体力值最多(或之一)的角色,你对其造成1点伤害。",
+ olsanyao_info: "出牌阶段每项各限一次,你可以弃置一张牌并指定一名体力值或手牌数最多(或之一)的角色,并对其造成1点伤害。",
+ rezhiman_info: "当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其区域内的一张牌。",
+ resanyao_info: "出牌阶段限一次,你可以弃置任意张牌并指定等量除你外体力值最多(或之一)的其他角色。你对这些角色依次造成1点伤害。",
+ paiyi_info: "出牌阶段限一次,你可以移去一张“权”并选择一名角色,令其摸两张牌,然后若其手牌数大于你,你对其造成1点伤害。",
+ zili_info: "觉醒技,准备阶段开始时,若“权”的数量不小于3,你减1点体力上限,然后选择一项:1、回复1点体力;2、摸两张牌。然后你获得技能“排异”。",
+ quanji_info: "当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。",
+ xianzhou_info: "限定技。出牌阶段,你可以将装备区内的所有牌交给一名其他角色,然后该角色选择一项:令你回复X点体力;或对其攻击范围内的X名角色各造成1点伤害(X为你以此法交给该角色的牌的数量)。",
+ qieting_info: "其他角色的回合结束时,若其未于此回合内使用过指定其他角色为目标的牌,你可以选择一项:将其装备区里的一张牌移动至你装备区里的相应位置;或摸一张牌。",
+ zhuikong_info: "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色本回合使用的牌不能指定除该角色外的角色为目标。若你没赢,其本回合至你的距离视为1。",
+ oldzhuikong_info: "其他角色的准备阶段,若你已受伤,你可以与该角色拼点。若你赢,该角色跳过本回合的出牌阶段。若你没赢,其本回合至你的距离视为1。",
+ qiuyuan_info: "当你成为【杀】的目标时,你可以令一名其他角色选择一项:①、交给你一张【闪】;②、成为此【杀】的额外目标。",
+ oldqiuyuan_info: "当你成为【杀】的目标时,你可以令一名有手牌的其他角色正面朝上交给你一张牌。若此牌不为【闪】,则该角色也成为此【杀】的额外目标。",
+ gongji_info: "出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。",
+ zhuiyi_info: "当你死亡时,你可以令一名其他角色(杀死你的角色除外)摸三张牌,然后其回复1点体力。",
+ anxu_info: "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌多的角色将一张手牌交给手牌少的角色,然后若这两名角色手牌数相等,你摸一张牌或回复1点体力。",
+ old_anxu_info: "出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌。",
+ zongxuan_info: "当你的牌因弃置而进入弃牌堆后,你可以将其按任意顺序置于牌堆顶。",
+ zhiyan_info: "结束阶段,你可以令一名角色摸一张牌并展示之,若为装备牌,其使用此牌并回复1点体力。",
+ miji_info: "结束阶段,若你已受伤,则可以摸X张牌,然后可以将等量的牌交给其他角色(X为你已损失的体力值)。",
+ zhenlie_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后弃置对方一张牌。",
+ chengxiang_info: "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。",
+ oldchengxiang_info: "当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于12的牌。",
+ renxin_info: "当体力值为1的一名其他角色受到伤害时,你可以将武将牌翻面并弃置一张装备牌,然后防止此伤害。",
+ oldrenxin_info: "其他角色进入濒死状态时,你可以将所有手牌交给该角色并翻面,然后该角色回复1点体力。",
+ jingce_info: "出牌阶段结束时,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。",
+ xinjingce_info: "结束阶段,若你本回合使用的牌数量大于或等于你的当前体力值,你可以摸两张牌。",
+ xswuyan_info: "锁定技,你使用的普通锦囊牌对其他角色无效;其他角色使用的普通锦囊牌对你无效。",
+ xinwuyan_info: "锁定技,当你使用锦囊牌造成伤害时,你防止此伤害;锁定技,当你受到锦囊牌对你造成的伤害时,你防止此伤害。",
+ jujian_info: "出牌阶段限一次,你可以弃至多三张牌,然后令一名其他角色摸等量的牌。若你以此法弃牌不少于三张且均为同一类别,你回复1点体力。",
+ xinjujian_info: "结束阶段开始时,你可以弃置一张非基本牌并选择一名其他角色,令其选择一项:1.摸两张牌;2.回复1点体力;3.将其武将牌翻转至正面朝上并重置之。",
+ luoying_info: "当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。",
+ jiushi_info: "当你需要使用一张【酒】时,若你的武将牌正面朝上,则你可以将武将牌翻面并视为使用了一张【酒】;当你受到伤害时,若你的武将牌背面朝上,则你可在此伤害结算后将武将牌翻回正面。",
+ jueqing_info: "锁定技,你即将造成的伤害均视为失去体力。",
+ shangshi_info: "当你的手牌数小于X时,你可以将手牌摸至X张(X为你已损失的体力值)。",
+ xuanfeng_info: "当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌。",
+ zhiyu_info: "当你受到伤害后,你可以摸一张牌,然后展示所有手牌。若颜色均相同,你令伤害来源弃置一张手牌。",
+ qice_info: "出牌阶段限一次,你可以将所有的手牌(至少一张)当做任意一张普通锦囊牌使用。",
+ jiangchi_info: "摸牌阶段摸牌时,你可以选择一项:1、额外摸一张牌,若如此做,你不能使用或打出【杀】直到回合结束。 2、少摸一张牌,若如此做,你使用【杀】无距离限制且可以多使用一张【杀】直到回合结束。",
+ zishou_info: "摸牌阶段,你可以额外摸X张牌(X为场上势力数)。然后你于本回合的出牌阶段内使用的牌不能指定其他角色为目标。",
+ zongshi_info: "锁定技,你的手牌上限+X(X为场上现存势力数)。",
+ danshou_info: "出牌阶段,你可以选择你攻击范围内的一名其他角色,然后弃置X张牌(X为此前你于此阶段你发动“胆守”的次数+1)。若X:为1,你弃置该角色的一张牌;为2,令该角色交给你一张牌;为3,你对该角色造成1点伤害;不小于4,你与该角色各摸两张牌。",
+ olddanshou_info: "当你造成伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。",
+ xindanshou_info: "①每回合限一次,当你成为基本牌或锦囊牌的目标后,你可以摸X张牌(X为你本回合内成为过基本牌或锦囊牌的目标的次数)。②一名其他角色的结束阶段,若你本回合内没有发动过〖胆守①〗,则你可以弃置X张牌并对其造成1点伤害(X为其手牌数,无牌则不弃)。",
+ yizhong_info: "锁定技,当你的防具栏为空时,黑色的【杀】对你无效。",
+ xinzhan_info: "出牌阶段限一次,若你的手牌数大于你的体力上限,你可以观看牌堆顶的三张牌,然后展示其中任意红桃牌并获得之。",
+ huilei_info: "锁定技,当你死亡时,杀死你的角色弃置所有的牌。",
+ enyuan_info: "锁定技。①当其他角色令你回复1点体力后,该角色摸一张牌。②当其他角色对你造成伤害后,其须交给你一张♥手牌,否则失去1点体力。",
+ xuanhuo_info: "出牌阶段限一次,你可以将一张红桃手牌交给一名其他角色,获得该角色的一张牌,然后交给除该角色外的一名其他角色。",
+ ganlu_info: "出牌阶段限一次,你可以选择两名装备区内装备数之差不大于X的角色,令其交换装备区内的牌(X为你已损失的体力值)。",
+ buyi_info: "当有角色进入濒死状态时,你可以展示该角色的一张手牌:若此牌不为基本牌,则该角色弃置此牌并回复1点体力。",
+ mingce_info: "出牌阶段,你可以交给一名其他角色一张装备牌或【杀】,然后令该角色选择一项:1. 视为对其攻击范围内的另一名由你指定的角色使用一张【杀】。2. 摸一张牌。每回合限一次。",
+ zhichi_info: "锁定技,当你于回合外受到伤害后,所有【杀】或普通锦囊牌对你无效直到回合结束。",
+ zhichi2_info: "智迟已发动",
+ pojun_info: "当你使用【杀】造成伤害后,你可以令受伤角色摸X张牌,然后其翻面(X为该角色的体力值且至多为5)。",
+ shiyong: "恃勇",
+ shiyong_info: "锁定技,当你受到一次红色【杀】或【酒】【杀】造成的伤害后,须减1点体力上限。",
+ old_guanzhang: "旧关兴张苞",
+ old_guanzhang_prefix: "旧",
+ wangyi: "王异",
+ oldqianxi: "潜袭",
+ oldqianxi_info: "当你使用【杀】对距离为1的目标角色造成伤害时,你可以进行一次判定,若判定结果不为红桃,你防止此伤害,令其减1点体力上限。",
+ oldzhenlie: "贞烈",
+ oldzhenlie_info: "在你的判定牌生效前,你可以亮出牌堆顶的一张牌代替之。",
+ oldmiji: "秘计",
+ oldmiji_info: "准备/结束阶段开始时,若你已受伤,你可以判定,若判定结果为黑色,你观看牌堆顶的X张牌(X为你已损失的体力值),然后将这些牌交给一名角色。",
+ old_fuhun: "父魂",
+ old_fuhun_info: "摸牌阶段开始时,你可以放弃摸牌,改为从牌堆顶亮出两张牌并获得之,若亮出的牌颜色不同,你获得〖武圣〗和〖咆哮〗直到回合结束。",
+ rejueqing: "绝情",
+ rejueqing_info: "当你对其他角色造成伤害时,你可以令此伤害值+X。若如此做,你失去X点体力并修改〖绝情〗(X为伤害值)。",
+ rejueqing_1st: "绝情",
+ rejueqing_rewrite: "绝情·改",
+ rejueqing_rewrite_info: "锁定技,你即将造成的伤害均视为失去体力。",
+ reshangshi: "伤逝",
+ reshangshi_2nd: "伤逝",
+ reshangshi_info: "当你受到伤害时,你可以弃置一张牌。当你的手牌数小于X时,你可以将手牌摸至X张。(X为你已损失的体力值)",
+ rejingce: "精策",
+ rejingce2: "精策",
+ rejingce_add: "精策",
+ rejingce_info: "当你于一回合内首次使用某种花色的手牌时,你的手牌上限+1。出牌阶段结束时,你可以摸X张牌(X为你本阶段内使用过的牌的类型数)。",
+ xinkuangbi: "匡弼",
+ xinkuangbi_info: "出牌阶段限一次。你可以令一名其他角色交给你至多三张牌(不计入你本回合的手牌上限)。然后其于其的下回合开始时摸等量的牌。",
+ xinzhaofu: "诏缚",
+ xinzhaofu_info: "主公技,限定技。出牌阶段,你可选择至多两名其他角色。这两名角色视为在所有其他吴势力角色的攻击范围内。",
+ olbingyi: "秉壹",
+ olbingyi_info: "每阶段限一次。当你因弃置而失去牌后,你可以展示所有手牌。若这些牌的颜色均相同,则你可以与至多X名其他角色各摸一张牌(X为你的手牌数)。",
+ lukai: "陆凯",
+ lukai_spade: "♠",
+ lukai_spade_bg: "♠️",
+ lukai_heart: "♥",
+ lukai_heart_bg: "♥️",
+ lukai_club: "♣",
+ lukai_club_bg: "♣",
+ lukai_diamond: "♦",
+ lukai_diamond_bg: "♦️️",
+ lkbushi: "卜筮",
+ lkbushi_info: "①你使用♠牌无次数限制。②当你使用或打出♥牌后,你摸一张牌。③当你成为♣牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张♦牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。",
+ lkzhongzhuang: "忠壮",
+ lkzhongzhuang_info: "锁定技。①当你因执行【杀】的效果而造成伤害时,若你的攻击范围大于3,则此伤害+1。②当一名角色受到你因执行【杀】的效果而造成的伤害时,若你的攻击范围小于3,则此伤害改为1。",
+ kebineng: "轲比能",
+ kousheng: "寇旌",
+ kousheng_info: "①出牌阶段开始时,你可以选择任意张手牌,这些牌称为“寇旌”直到回合结束。②你的“寇旌”均视为【杀】且无次数限制。③当你因执行对应实体牌包含“寇旌”的【杀】的效果而造成伤害后,你展示所有“寇旌”牌,然后目标角色可以用所有手牌交换这些牌。",
+ zhugeshang: "诸葛尚",
+ sangu: "三顾",
+ sangu_info: "结束阶段,你可以选择至多三个{【杀】或不为notarget或singleCard的普通锦囊牌}中的牌名,然后令一名其他角色记录这些牌名。该角色的下个出牌阶段开始时,其的手牌于其需要使用牌时均视为其记录中的第一张牌直到此阶段结束,且当其使用或打出有对应实体牌的牌时,移除这些牌中的第一张牌。若你以此法选择过的牌名均为你本回合内使用过的牌名,则防止你因其以此法使用牌造成的伤害。",
+ yizu: "轶祖",
+ yizu_info: "锁定技。每回合限一次,当你成为【杀】或【决斗】的目标后,若你的体力值不大于使用者的体力值,则你回复1点体力。",
+ liwan: "李婉",
+ liandui: "联对",
+ liandui_info: "①当你使用牌时,若本局游戏内上一张被使用的牌的使用者不为你,你可以令其摸两张牌。②其他角色使用牌时,若本局游戏内上一张被使用的牌的使用者为你,其可以令你摸两张牌。",
+ biejun: "别君",
+ biejun_info: "①其他角色的出牌阶段限一次。其可以将一张手牌交给你。②每回合限一次。当你受到伤害时,若你手牌中没有本回合因〖别君①〗得到的牌,你可以翻面并防止此伤害。",
+ yj_sufei: "苏飞",
+ shuojian: "数谏",
+ shuojian_info: "出牌阶段限三次。你可以交给一名其他角色一张牌,其选择一项:1.令你摸X张牌并弃置X-1张牌;2.视为使用X张【过河拆桥】,然后此技能本回合失效(X为此技能本阶段剩余发动次数+1)。",
+ yj_qiaozhou: "谯周",
+ shiming: "识命",
+ shiming_info: "每轮限一次。一名角色的摸牌阶段,你可以观看牌堆顶的三张牌,并可以将其中一张置于牌堆底。然后该角色可以改为对自己造成1点伤害,然后从牌堆底摸三张牌。",
+ jiangxi: "将息",
+ jiangxi_info: "一名角色的回合结束时,若一号位于此回合内进入过濒死状态或未受到过伤害,你可以重置〖识命〗并摸一张牌;若所有角色均未受到过伤害,你可以与当前回合角色各摸一张牌。",
+ hanlong: "韩龙",
+ duwang: "独往",
+ duwang_info: "锁定技。①游戏开始时,你从牌堆顶将五张不为【杀】的牌置于武将牌上,称为“刺”。②若你有牌名不为【杀】“刺”,你至其他角色或其他角色至你的距离+1。",
+ cibei: "刺北",
+ cibei_info: "①当一名角色使用【杀】造成伤害且此牌对应的实体牌进入弃牌堆后,你可以将一张不为【杀】的“刺”置入弃牌堆,并将这些牌置入“刺”,然后弃置一名角色区域里的一张牌。②一名角色的回合结束时,若你的“刺”均为【杀】,你获得所有“刺”,且这些牌不能被弃置,不计入手牌上限,且当你使用对应实体牌包含这些牌的牌时无次数和距离限制。",
+ wuanguo: "武安国",
+ diezhang: "叠嶂",
+ diezhang_info: "转换技。①出牌阶段,你使用杀的次数上限+1。②阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用X张【杀】;阳:当其他角色使用牌被你抵消后,你可以摸X张牌,视为对其使用一张【杀】(X为1)。",
+ duanwan: "断腕",
+ duanwan_info: "限定技。当你处于濒死状态时,你可以将体力回复至2点,然后删除〖叠嶂①〗和当前转换技状态的〖叠嶂②〗分支,并将〖叠嶂〗修改为“每回合限一次”且将X修改为2。",
+ dcduliang: "督粮",
+ dcduliang2: "督粮",
+ dcduliang_info: "出牌阶段限一次。你可以获得一名其他角色的一张牌,然后选择一项:1.你观看牌堆顶的两张牌,然后令其获得其中的一或两张基本牌;2.令其于下回合的摸牌阶段额外摸一张牌。",
+ sunli: "孙礼",
+ kangli: "伉厉",
+ kangli_info: "当你造成或受到伤害后,你摸两张牌。然后你下次造成伤害时弃置这些牌。",
+ xiahoumao: "夏侯楙",
+ tongwei: "统围",
+ tongwei_info: "出牌阶段限一次。你可以重铸两张牌并指定一名其他角色,当其使用的下一张牌结算结束后,若此牌点数在你上次以此法重铸的牌的点数之间,你视为对其使用一张【杀】或【过河拆桥】。",
+ cuguo: "蹙国",
+ cuguo_info: "锁定技。当你于一回合使用牌首次被抵消后,你弃置一张牌,视为对此牌的目标角色使用一张该被抵消的牌。此牌结算结束后,若此牌被抵消,你失去1点体力。",
+ chenshi: "陈式",
+ qingbei: "擎北",
+ qingbei_info: "一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用一张有花色的牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。",
+ feiyao: "费曜",
+ zhenfeng: "镇锋",
+ zhenfeng_info: "每回合限一次。当其他角色于其回合内使用牌时,若其手牌数不大于其体力值,你可以猜测其手牌中与此牌类别相同的牌数。若你猜对,你摸X张牌并视为对其使用一张【杀】(X为你连续猜对的次数且至多为5);若你猜错且差值大于1,其视为对你使用一张【杀】。",
+ linghuyu: "令狐愚",
+ yj_simafu: "司马孚",
+ yj_xuangongzhu: "宣公主",
+ xukun: "徐琨",
+ xvzhi: "蓄志",
+ xvzhi_info: "出牌阶段限一次,你可令两名角色各选择任意张手牌并交换这些牌,然后获得牌数较少的角色视为使用无视距离的【杀】;若获得牌数相等,你摸两张牌且可以对此阶段未以此法选择过的角色再发动一次〖蓄志〗。",
+ beiyu: "备预",
+ beiyu_info: "出牌阶段限一次,你可将手牌摸至体力上限,然后你将一种花色的所有手牌置于牌堆底。",
+ duchi: "督持",
+ duchi_info: "每回合限一次,当你成为其他角色使用牌的目标后,你可从牌堆底摸一张牌并展示所有手牌,若颜色均相同,则此牌对你无效。",
+ yjqimei: "齐眉",
+ yjqimei_info: "出牌阶段限一次,你可以选择一名其他角色,你与其各摸两张牌并弃置两张牌,然后你根据你与其弃置牌的花色总数执行以下效果:1、你依次使用这些弃置的牌中可以使用的牌;2、你与其复原武将牌;3、你与其横置武将牌;4、你与其各摸一张牌,然后你修改〖齐眉〗为“出牌阶段限两次”直到回合结束。",
+ yjzhuiji: "追姬",
+ yjzhuiji_info: "当你死亡时,你可以令一名角色从牌堆和弃牌堆中的随机使用任意装备牌直至其没有空置的装备栏。若如此做,当其失去以此法使用的装备牌后,其废除对应的装备栏。",
+ fazhu: "筏铸",
+ fazhu_info: "准备阶段,你可以重铸你的区域内的所有非伤害牌,然后将以此法获得的牌交给至多等量名角色各一张,这些角色可以依次使用一张无距离限制的【杀】。",
+};
+
+export default translates;
diff --git a/character/yijiang/voices.js b/character/yijiang/voices.js
new file mode 100644
index 000000000..956de759e
--- /dev/null
+++ b/character/yijiang/voices.js
@@ -0,0 +1,389 @@
+export default {
+ "#tongwei1": "集关西诸路大军,必雪当年长坂坡之耻。",
+ "#tongwei2": "手织天网十万尺,欲擒飞龙落彀中。",
+ "#cuguo1": "身担父命,怎可蜷于宫阙。",
+ "#cuguo2": "体承国运,岂能缩居朝堂。",
+ "#xiahoumao:die": "一将无能,徒累死三军。",
+ "#qingbei1": "待追上那司马懿,定教他没好果子吃!",
+ "#qingbei2": "身若不周,吾一人可作擎北之柱。",
+ "#chenshi:die": "丞相、丞相!是魏延指使我的!",
+ "#kangli1": null,
+ "#kangli2": null,
+ "#sunli:die": null,
+ "#zhenfeng1": null,
+ "#zhenfeng2": null,
+ "#feiyao:die": null,
+ "#diezhang1": "某家这大锤,舞起来那叫一个万夫莫敌。",
+ "#diezhang2": "贼吕布何在?某家来取汝性命了!",
+ "#duanwan1": "好你个吕奉先,竟敢卸我膀子!",
+ "#duanwan2": "汝这匹夫,为何往手腕上招呼?",
+ "#wuanguo:die": "吕奉先,你给某家等着!",
+ "#duwang1": "此去,欲诛敌莽、杀单于。",
+ "#duwang2": "风萧萧兮易水寒,壮士一去兮不复还!",
+ "#cibei1": "匹夫一怒,流血二人,天下缟素。",
+ "#cibei2": "我欲效专诸、聂政之旧事,逐天狼于西北。",
+ "#hanlong:die": "杀轲比能者,韩龙也!",
+ "#shiming1": "今天命在北,我等已尽人事。",
+ "#shiming2": "益州国疲民敝,非人力可续之。",
+ "#jiangxi1": "典午忽兮,月酉没兮。",
+ "#jiangxi2": "周慕孔子遗风,可与刘、扬同轨。",
+ "#yj_qiaozhou:die": "炎汉百年之业,吾一言毁之……",
+ "#shuojian1": "我数荐卿而祖不用,其之失也。",
+ "#shuojian2": "兴霸乃当世豪杰,何患无爵。",
+ "#yj_sufei:die": "兴霸何在?吾命休矣……",
+ "#liandui1": "以句相联,抒离散之苦。",
+ "#liandui2": "以诗相对,颂哀怨之情。",
+ "#biejun1": "彼岸荼蘼远,落寞北风凉。",
+ "#biejun2": "此去经年,不知何时能归?",
+ "#liwan:die": "生不能同寝,死亦难同穴……",
+ "#sangu1": "思报君恩,尽父子之忠。",
+ "#sangu2": "欲酬三顾,竭三代之力。",
+ "#yizu1": "仿祖父行事,可阻敌袭。",
+ "#yizu2": "习先人故智,可御寇侵。",
+ "#zhugeshang:die": "父子荷国重恩,当尽忠以报!",
+ "#kousheng1": "驰马掠野,塞外称雄。",
+ "#kousheng2": "控弦十万,纵横漠南。",
+ "#kebineng:die": "草原雄鹰,折翼于此……",
+ "#lkbushi1": "论演玄意,以筮辄验。",
+ "#lkbushi2": "手不释书,好研经卷。",
+ "#lkzhongzhuang1": "秽尘天听,卿有不测之祸!",
+ "#lkzhongzhuang2": "倾乱国政,安得寿终正寝?",
+ "#lukai:die": "不听忠言,国将亡矣……",
+ "#xinxuanhuo1": "收人钱财,替人消灾。",
+ "#xinxuanhuo2": "哼,叫你十倍奉还!",
+ "#xinenyuan1": "报之以李,还之以桃。",
+ "#xinenyuan2": "伤了我,休想全身而退!",
+ "#xin_fazheng:die": "汉室复兴,我,是看不到了……",
+ "#fuhun1": "光复汉室,重任在肩!",
+ "#fuhun2": "将门虎子,承我父志!",
+ "#guanzhang:die": "未能手刃仇敌,愧对先父。",
+ "#zhenlie1": "虽是妇人,亦当奋身一搏!",
+ "#zhenlie2": "为雪前耻,不惜吾身!",
+ "#miji1": "此计,可歼敌精锐!",
+ "#miji2": "此举,可破敌之围!",
+ "#wangyi:die": "月儿,不要责怪你爹爹……",
+ "#new_jiangchi1": "身当矢石,驰骛四方!",
+ "#new_jiangchi2": "稳兵自重,静观其变!",
+ "#caozhang:die": "子桓,你害我!",
+ "#jingce1": "方策精详,有备无患。",
+ "#jingce2": "精兵据敌,策守如山。",
+ "#guohuai:die": "姜维小儿,竟然……",
+ "#jueqing1": "你的死活,与我何干?",
+ "#jueqing2": "无来无去,不悔不怨。",
+ "#shangshi1": "无情者伤人,有情者自伤。",
+ "#shangshi2": "自损八百,可伤敌一千。",
+ "#zhangchunhua:die": "怎能如此对我!",
+ "#luoying": null,
+ "#luoying1": "别着急扔,给我就好。",
+ "#luoying2": "这些都是我的。",
+ "#jiushi11": "置酒高殿上,亲友从我游。",
+ "#jiushi12": "走马行酒醴,驱车布鱼肉。",
+ "#caozhi:die": "本是同根生,相煎何太急。",
+ "#chengxiang1": "依我看,小事一桩。",
+ "#chengxiang2": "孰重孰轻,一称便知。",
+ "#renxin1": "仁者爱人,人恒爱之。",
+ "#renxin2": "有我在,别怕。",
+ "#caochong:die": "子桓哥哥……",
+ "#qice1": "奇策在此,谁与争锋?",
+ "#qice2": "倾力为国,算无遗策。",
+ "#zhiyu1": "大勇若怯,大智如愚。",
+ "#zhiyu2": "愚者既出,智者何存?",
+ "#xunyou:die": "主公何日再得无忧?",
+ "#xinwuyan1": "汝有良策,何必问我!",
+ "#xinwuyan2": "吾,誓不为汉贼献一策!",
+ "#xinjujian1": "卧龙之才,远胜于我。",
+ "#xinjujian2": "天下大任,望君莫辞!",
+ "#xin_xushu:die": "忠孝不能两全,孩儿……",
+ "#sanyao1": "三人成虎,事多有。",
+ "#sanyao2": "散谣惑敌,不攻自破!",
+ "#zhiman1": "丞相多虑,且看我的!",
+ "#zhiman2": "兵法谙熟于心,取胜千里之外!",
+ "#xin_masu:die": null,
+ "#danshou1": "以胆为守,扼敌咽喉!",
+ "#danshou2": "到此为止了!",
+ "#zhuran:die": "何人竟有如此之胆!?",
+ "#xinpojun1": "大军在此!汝等休想前进一步!",
+ "#xinpojun2": "敬请,养精蓄锐!",
+ "#xusheng:die": "可怜一身胆略,尽随一抔黄土……",
+ "#ganlu1": "男婚女嫁,须当交换文定之物。",
+ "#ganlu2": "此真乃吾之佳婿也。",
+ "#buyi1": "吾乃吴国之母,何人敢放肆?",
+ "#buyi2": "有老身在,汝等尽可放心。",
+ "#wuguotai:die": "卿等,务必用心辅佐仲谋……",
+ "#xuanfeng1": "伤敌于千里之外!",
+ "#xuanfeng2": "索命于须臾之间!",
+ "#lingtong:die": "大丈夫,不惧死亡……",
+ "#zishou1": "江河霸主,何惧之有?",
+ "#zishou2": "荆襄之地,固若金汤。",
+ "#zongshi1": "汉室百年,坚如磐石。",
+ "#zongshi2": "宗室子弟,尽收民心。",
+ "#liubiao:die": "优柔寡断,要不得啊。",
+ "#zhiyan1": "志节分明,折而不屈!",
+ "#zhiyan2": "直言劝谏,不惧祸否!",
+ "#zongxuan1": "依易设象,以占吉凶。",
+ "#zongxuan2": "世间万物,皆有定数。",
+ "#yufan:die": "我枉称东方朔再世……",
+ "#mingce1": "如此,霸业可图也。",
+ "#mingce2": "如此,一击可擒也。",
+ "#zhichi1": "如今之计,唯有退守,再做决断。",
+ "#zhichi2": "若吾,早知如此……",
+ "#chengong:die": "请出就戮!",
+ "#anxu1": "和鸾雍雍,万福攸同。",
+ "#anxu2": "君子乐胥,万邦之屏。",
+ "#zhuiyi1": "终其永怀,恋心殷殷。",
+ "#zhuiyi2": "妾心所系,如月之恒。",
+ "#bulianshi:die": "江之永矣,不可方思。",
+ "#gongji1": "吃我一箭!",
+ "#gongji2": "鼠辈,哪里走!",
+ "#jiefan1": "退后,这里交给我!",
+ "#jiefan2": "休想趁人之危!",
+ "#handang:die": "今后,只能靠你了。",
+ "#qiuyuan1": "逆贼逞凶,卿可灭之。",
+ "#qiuyuan2": "求父亲救救大汉江山吧!",
+ "#zhuikong1": "诚惶诚恐,夜不能寐。",
+ "#zhuikong2": "嘘,隔墙有耳。",
+ "#fuhuanghou:die": "陛下为何不救臣妾……",
+ "#quanji1": "这仇,我记下了。",
+ "#quanji2": "先让你得意几天。",
+ "#zili1": "欲取天下,当在此时!",
+ "#zili2": "时机已到,今日起兵!",
+ "#zhonghui:die": "伯约,让你失望了。",
+ "#qiaoshui1": "合则两利,斗则两伤。",
+ "#qiaoshui2": "君且安坐,听我一言。",
+ "#jyzongshi1": "买卖不成,情义还在。",
+ "#jyzongshi2": "此等小事,何须挂耳?",
+ "#jianyong:die": "两国交战……不斩……",
+ "#mashu": null,
+ "#mashu1": null,
+ "#mashu2": null,
+ "#qianxi1": "喊什么喊?我敢杀你!",
+ "#qianxi2": "笑什么笑?叫你得意!",
+ "#old_madai:die": "我怎么会死在这里……",
+ "#xiansi1": "袭人于不意,溃敌于无形!",
+ "#xiansi2": "破敌军阵,父亲定会刮目相看!",
+ "#liufeng:die": "父亲,为什么……",
+ "#junxing1": "严刑峻法,以破奸诡之胆。",
+ "#junxing2": "你招还是不招?",
+ "#yuce1": "御敌之策,成竹于胸。",
+ "#yuce2": "以缓制急,不战屈兵。",
+ "#manchong:die": "援军为何迟迟未到……",
+ "#pindi1": "定品寻良骥,中正探人杰。",
+ "#pindi2": "取才赋职,论能行赏。",
+ "#faen1": "礼法容情,皇恩浩荡。",
+ "#faen2": "法理有度,恩威并施。",
+ "#chenqun:die": "吾身虽陨,典律昭昭。",
+ "#chanhui1": "你也休想置身事外!",
+ "#chanhui2": "你可别不识抬举!",
+ "#jiaojin1": "就凭你,还想算计于我?",
+ "#jiaojin2": "是谁借给你的胆子?",
+ "#sunluban:die": "本公主,何罪之有?",
+ "#shenxing1": "审时度势,乃容万变。",
+ "#shenxing2": "此需斟酌一二。",
+ "#bingyi1": "公正无私,秉持如一。",
+ "#bingyi2": "诸君看仔细了!",
+ "#guyong:die": "病躯渐重,国事难安……",
+ "#qieting1": "想欺我蔡氏,痴心妄想!",
+ "#qieting2": "此人不露锋芒,断不可留!",
+ "#xianzhou1": "献荆襄九郡,图一世之安。",
+ "#xianzhou2": "丞相携天威而至,吾等安敢不降。",
+ "#caifuren:die": "孤儿寡母,何必赶尽杀绝呢……",
+ "#jianying1": "由缓至急,循循而进。",
+ "#jianying2": "事需缓图,欲速不达也。",
+ "#shibei1": "矢志于北,尽忠于国!",
+ "#shibei2": "命系袁氏,一心向北。",
+ "#yj_jushou:die": "智士凋亡,河北哀矣……",
+ "#qiangzhi1": "文书强识,才可博于运筹。",
+ "#qiangzhi2": "容我过目,即刻咏来。",
+ "#xiantu1": "将军莫虑,且看此图。",
+ "#zhangsong:die": "皇叔不听吾谏言,悔时晚矣!",
+ "#fenli1": "以逸待劳,坐收渔利。",
+ "#fenli2": "以主制客,占尽优势。",
+ "#pingkou1": "对敌人仁慈,就是对自己残忍。",
+ "#pingkou2": "反守为攻,直捣黄龙!",
+ "#zhuhuan:die": "我不要死在这病榻之上……",
+ "#qiaoshi1": "樵心遇郎君,妾心涟漪生。",
+ "#qiaoshi2": "樵前情窦开,君后寻迹来。",
+ "#yanyu1": "感君一回顾,思君朝与暮。",
+ "#yanyu2": "伴君一生不寂寞。",
+ "#xiahoushi:die": "愿有来世,不负前缘……",
+ "#duodao1": "这刀岂是你配用的?",
+ "#duodao2": "夺敌兵刃,如断其臂!",
+ "#anjian1": "击其懈怠,攻其不备!",
+ "#anjian2": "哼,你满身都是破绽!",
+ "#panzhangmazhong:die": "怎么可能,我明明亲手将你……",
+ "#zhongyong1": "驱刀飞血,直取寇首!",
+ "#zhongyong2": "为将军提刀携马,万死不辞!",
+ "#zhoucang:die": "为将军操刀牵马,此生无憾。",
+ "#longyin1": "破阵杀敌,愿献犬马之劳!",
+ "#longyin2": "虎啸既响,龙吟当附!",
+ "#guanping:die": "父亲快走,孩儿断后……",
+ "#dangxian1": "先锋就由老夫来当!",
+ "#dangxian2": "看我先行破敌!",
+ "#fuli1": "有老夫在,蜀汉就不会倒下!",
+ "#fuli2": "今天是个拼命的好日子,哈哈哈哈!",
+ "#liaohua:die": "今后,就靠你们啦……",
+ "#lihuo1": "将士们,引火对敌!",
+ "#lihuo2": "和我同归于尽吧!",
+ "#chunlao1": "唉,帐中不可无酒啊!",
+ "#chunlao2": "无碍,且饮一杯!",
+ "#chengpu:die": "没,没有酒了……",
+ "#xianzhen1": "攻无不克,战无不胜!",
+ "#xianzhen2": "破阵斩将,易如反掌!",
+ "#jinjiu1": "贬酒阙色,所以无污。",
+ "#jinjiu2": "避嫌远疑,所以无误。",
+ "#gaoshun:die": "生死有命……",
+ "#sidi1": "筑城固守,司敌备战。",
+ "#sidi2": "徒手制敌,能奈我何?",
+ "#caozhen:die": "秋雨凄迷,军心已乱……",
+ "#benxi1": "奔战万里,袭关斩将。",
+ "#benxi2": "袭敌千里,溃敌百步!",
+ "#wuyi:die": "奔波已疲,难以,再战。",
+ "#shenduan1": "良机虽去,尚可截资断源!",
+ "#shenduan2": "行军须慎,谋断当绝!",
+ "#yonglve1": "不必从言,自有主断!",
+ "#yonglve2": "非常之机,当行非常之计!",
+ "#hanhaoshihuan:die": "那拈弓搭箭的将军,是何人?",
+ "#huituo1": "富我大魏,扬我国威!",
+ "#huituo2": "大展宏图,就在今日!",
+ "#mingjian1": "孰忠孰奸,朕尚能明辨!",
+ "#mingjian2": "你我推心置腹,岂能相负。",
+ "#xingshuai1": "聚群臣而嘉勋,隆天子之气运!",
+ "#xingshuai2": "百年兴衰皆由人,不由天!",
+ "#caorui:die": "悔不该耽于逸乐,至有今日……",
+ "#qianju": null,
+ "#qianju1": null,
+ "#qianju2": null,
+ "#qingxi1": "策马疾如电,溃敌一瞬间。",
+ "#qingxi2": "虎豹骑岂能徒有虚名?杀!",
+ "#caoxiu:die": "兵行险招,终有一失。",
+ "#huomo1": "妙笔在手,研墨在心。",
+ "#huomo2": "笔墨写春秋,挥毫退万敌!",
+ "#zuoding1": "承君恩宠,报效国家!",
+ "#zuoding2": "只有忠心,没有谋略,是不够的。",
+ "#zhongyao:die": "墨尽,岁终。",
+ "#zhanjue1": "成败在此一举,杀!",
+ "#zhanjue2": "此刻,唯有死战,安能言降!",
+ "#qinwang11": "国有危难,哪位将军请战?",
+ "#qinwang12": "大厦倾危,谁堪栋梁!",
+ "#liuchen:die": "无言对百姓,有愧,见先祖……",
+ "#wurong": null,
+ "#wurong1": "兵不血刃,亦可先声夺人。",
+ "#wurong2": "从则安之,犯则诛之。",
+ "#shizhi1": null,
+ "#shizhi2": null,
+ "#zhangyi:die": "大丈夫当战死沙场,马革裹尸而还。",
+ "#yanzhu1": "大局已定,你还是放弃吧。",
+ "#yanzhu2": "不诛此权臣,朕,何以治天下?",
+ "#xingxue1": "文修武备,才是兴国之道。",
+ "#xingxue2": "汝等都是国之栋梁。",
+ "#zhaofu": null,
+ "#zhaofu1": "奉朕之诏,擒此国贼!",
+ "#zhaofu2": "天子震怒,贼臣授首。",
+ "#sunxiu:die": "崇文抑武,朕错了吗?",
+ "#anguo1": "止干戈,休战事。",
+ "#anguo2": "安邦定国,臣子分内之事。",
+ "#zhuzhi:die": "集毕生之力,保国泰民安。",
+ "#yaoming1": "民不足食,何以养军?",
+ "#yaoming2": "看我如何以无用之力换己所需,哈哈哈!",
+ "#quancong:die": "儿啊,好好报答吴王知遇之恩……",
+ "#huaiyi1": "一生纵横,怎可对他人称臣!",
+ "#huaiyi2": "此等小利,焉能安吾雄心?",
+ "#gongsunyuan:die": "天不容我公孙家……",
+ "#jigong1": "曹贼势颓,主公速击之。",
+ "#jigong2": "不惜一切代价,拿下此人!",
+ "#shifei1": "良谋失利,罪在先锋!",
+ "#shifei2": "计略周详,怎奈指挥不当。",
+ "#guotufengji:die": "大势已去,无力回天……",
+ "#juece1": "哼!你走投无路了。",
+ "#juece2": "无用之人,死!",
+ "#xinmieji1": "宁错杀,无放过!",
+ "#xinmieji2": "你能逃得出我的手掌心吗?",
+ "#xinfencheng1": "我得不到的,你们也别想得到!",
+ "#xinfencheng2": "让这一切都灰飞烟灭吧!哼哼哼哼……",
+ "#xin_liru:die": "如遇明主,大业必成……",
+ "#jiaozhao1": "诏书在此,不得放肆!",
+ "#jiaozhao2": "妾身也是逼不得已,方才出此下策。",
+ "#danxin1": "司马一族,其心可诛。",
+ "#danxin2": "妾身定为我大魏鞠躬尽瘁,死而后已。",
+ "#guohuanghou:die": "陛下,臣妾这就来见你。",
+ "#zhige1": "天下和而平乱,神器宁而止戈。",
+ "#zhige2": "刀兵纷争既止,国运福祚绵长。",
+ "#zongzuo1": "尽死生之力,保大厦不倾。",
+ "#zongzuo2": "乾坤倒,黎民苦,高祖后,岂任之?",
+ "#liuyu:die": "怀柔之计,终非良策。",
+ "#duliang1": "告诉丞相,山路难走!请宽限几天。",
+ "#duliang2": "粮草已到,请将军验看。",
+ "#fulin1": "我乃托孤重臣,却在这儿搞什么粮草!",
+ "#fulin2": "丞相,丞相!你们没看见我吗?",
+ "#liyan:die": "孔明这一走,我算是没指望了。",
+ "#kuangbi1": "匡人助己,辅政弼贤。",
+ "#kuangbi2": "兴隆大化,佐理时务。",
+ "#sundeng:die": "愿陛下留意听采,儿臣虽死犹生。",
+ "#jishe1": "孙吴正当盛世,兴些土木又何妨?",
+ "#jishe2": "当再建新殿,扬我国威!",
+ "#lianhuo1": "用那剩下的铁石,正好做些工事。",
+ "#lianhuo2": "筑下这铁链,江东天险牢不可破!",
+ "#cenhun:die": "我为主上出过力!!!呃啊!",
+ "#qinqing1": "陛下勿忧,大将军危言耸听。",
+ "#qinqing2": "陛下,莫让他人知晓此事!",
+ "#huisheng1": "大人,这些钱够吗?",
+ "#huisheng2": "劳烦大人美言几句~",
+ "#huanghao:die": "魏军竟然真杀来了!",
+ "#taoluan1": "睁开你的眼睛看看,现在是谁说了算?",
+ "#taoluan2": "国家承平,神器稳固,陛下勿忧。",
+ "#zhangrang:die": "臣等殄灭,唯陛下自爱……(跳水声)",
+ "#guizao1": "这都是陛下的恩泽呀。",
+ "#guizao2": "陛下盛宠,臣万莫敢忘。",
+ "#jiyu1": "陛下,此人不堪大用。",
+ "#jiyu2": "尔等玩忽职守,依诏降职处置。",
+ "#sunziliufang:die": "唉,树倒猢狲散,鼓破众人捶呀。",
+ "#zhongjian1": "浊世风云变幻,当以明眸洞察。",
+ "#zhongjian2": "心中自有明镜,可鉴奸佞忠良。",
+ "#caishi1": "清识难尚,至德可师。",
+ "#caishi2": "知书达礼,博古通今。",
+ "#xinxianying:die": "吾一生明鉴,竟错看于你。",
+ "#fumian1": "人言吾吉人天相,福寿绵绵。",
+ "#fumian2": "永理二子,当保大汉血脉长存。",
+ "#daiyan1": "汝可于宫中多留几日无妨。",
+ "#daiyan2": "胡氏受屈,吾亦心不安。",
+ "#wuxian:die": "所幸伴君半生,善始终得善终。",
+ "#wengua1": "阴阳相生相克,万事周而复始。",
+ "#wengua2": "卦不能佳,可须异日。",
+ "#fuzhu1": "我连做梦都在等这一天呢。",
+ "#fuzhu2": "既然来了,就别想走了。",
+ "#xushi:die": "莫问前程凶吉,但求落幕无悔。",
+ "#shouxi1": "天子之位,乃归刘汉!",
+ "#shouxi2": "吾父功盖寰区,然且不敢篡窃神器。",
+ "#huimin1": "悬壶济世,施医救民。",
+ "#huimin2": "心系百姓,惠布山阳。",
+ "#caojie:die": "皇天必不祚尔。",
+ "#bizhuan1": "无墨不成书,无识不成才。",
+ "#bizhuan2": "笔可抒情,亦可诛心。",
+ "#tongbo": null,
+ "#tongbo1": "读万卷书,行万里路。",
+ "#tongbo2": "博学而不穷,笃行而不倦。",
+ "#caiyong:die": "感叹世事,何罪之有?",
+ "#qingxian1": "抚琴拨弦,悠然自得。",
+ "#qingxian2": "寄情于琴,合于天地。",
+ "#juexiang1": "此曲不能绝矣!",
+ "#juexiang2": "一曲琴音,为我送别。",
+ "#jikang:die": "多少遗恨,俱随琴音去。",
+ "#jianzheng1": "天时不当,必难取胜!",
+ "#jianzheng2": "且慢,此仗打不得!",
+ "#zhuandui1": "你已无话可说了吧!",
+ "#zhuandui2": "黄口小儿,也敢来班门弄斧?",
+ "#tianbian1": "当今天子为刘,天亦姓刘!",
+ "#tianbian2": "阁下知其然,而未知其所以然。",
+ "#qinmi:die": "我竟然,也百口莫辩了……",
+ "#funan1": "礼尚往来,乃君子风范。",
+ "#funan2": "以子之矛,攻子之盾。",
+ "#jiexun1": "帝王应以社稷为重,以大观为主。",
+ "#jiexun2": "吾冒昧进谏,只求陛下思虑。",
+ "#xuezong:die": "尔等,竟做如此有辱斯文之事。",
+ "#shiyong1": "好大一股杀气啊!",
+ "#shiyong2": "好大一股酒气啊!",
+ "#old_huaxiong:die": "皮厚不挡刀啊……",
+ "#jieyue1": "安营驻寨,严守城防。",
+ "#jieyue2": "诸军严整,敌军自乱。",
+ "#yujin:die": "我,无颜面对丞相了……",
+};
diff --git a/character/yingbian.js b/character/yingbian.js
deleted file mode 100644
index 92617b8cd..000000000
--- a/character/yingbian.js
+++ /dev/null
@@ -1,4286 +0,0 @@
-import { lib, game, ui, get, ai, _status } from "../noname.js";
-game.import("character", function () {
- return {
- name: "yingbian",
- connect: true,
- character: {
- chengjichengcui: ["male", "jin", 6, ["oltousui", "olchuming"]],
- wangxiang: ["male", "jin", 3, ["bingxin"]],
- jin_jiachong: ["male", "jin", 3, ["xiongshu", "jianhui"]],
- xuangongzhu: ["female", "jin", 3, ["gaoling", "qimei", "ybzhuiji"], ["hiddenSkill"]],
- xinchang: ["male", "jin", 3, ["canmou", "congjian"]],
- yangzhi: ["female", "jin", 3, ["xinwanyi", "maihuo"]],
- yangyan: ["female", "jin", 3, ["xinxuanbei", "xianwan"]],
- ol_huaxin: ["male", "wei", 3, ["caozhao", "olxibing"]],
- zhongyan: ["female", "jin", 3, ["bolan", "yifa"], ["clan:颍川钟氏"]],
- weiguan: ["male", "jin", 3, ["zhongyun", "shenpin"]],
- cheliji: ["male", "qun", 4, ["chexuan", "qiangshou"]],
- simazhou: ["male", "jin", 4, ["recaiwang", "naxiang"]],
- ol_lisu: ["male", "qun", 3, ["qiaoyan", "xianzhu"]],
- jin_yanghuiyu: ["female", "jin", 3, ["huirong", "ciwei", "caiyuan"], ["hiddenSkill"]],
- shibao: ["male", "jin", 4, ["zhuosheng"]],
- jin_zhangchunhua: ["female", "jin", 3, ["huishi", "qingleng", "xuanmu"], ["hiddenSkill"]],
- jin_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "xinquanbian"], ["hiddenSkill"]],
- jin_wangyuanji: ["female", "jin", 3, ["shiren", "yanxi"], ["hiddenSkill"]],
- jin_simazhao: ["male", "jin", 3, ["tuishi", "xinchoufa", "zhaoran", "chengwu"], ["zhu", "hiddenSkill"]],
- jin_xiahouhui: ["female", "jin", 3, ["baoqie", "jyishi", "shiduo"], ["hiddenSkill"]],
- jin_simashi: ["male", "jin", "3/4", ["taoyin", "yimie", "ruilve", "tairan"], ["hiddenSkill", "zhu"]],
- zhanghuyuechen: ["male", "jin", 4, ["xijue"]],
- duyu: ["male", "jin", 4, ["sanchen", "zhaotao"]],
- },
- characterSort: {
- yingbian: {
- yingbian_pack1: ["jin_simayi", "jin_zhangchunhua", "ol_lisu", "simazhou", "cheliji", "ol_huaxin"],
- yingbian_pack2: ["jin_simashi", "jin_xiahouhui", "zhanghuyuechen", "shibao", "jin_yanghuiyu", "chengjichengcui"],
- yingbian_pack3: ["jin_simazhao", "jin_wangyuanji", "duyu", "weiguan", "xuangongzhu"],
- yingbian_pack4: ["zhongyan", "xinchang", "jin_jiachong", "wangxiang"],
- yingbian_pack5: ["yangyan", "yangzhi"],
- },
- },
- skill: {
- //二成
- oltousui: {
- audio: 2,
- enable: "chooseToUse",
- viewAsFilter: function (player) {
- return player.countCards("he");
- },
- viewAs: {
- name: "sha",
- suit: "none",
- number: null,
- isCard: true,
- },
- filterCard: true,
- selectCard: [1, Infinity],
- position: "he",
- check: function (card) {
- const player = get.player();
- return 4.5 + (player.hasSkill("olchuming") ? 1 : 0) - 1.5 * ui.selected.cards.length - get.value(card);
- },
- popname: true,
- ignoreMod: true,
- precontent: function* (event, map) {
- var player = map.player;
- var evt = event.getParent();
- if (evt.dialog && typeof evt.dialog == "object") evt.dialog.close();
- player.logSkill("oltousui");
- delete event.result.skill;
- var cards = event.result.cards;
- player.loseToDiscardpile(cards, ui.cardPile, false, "blank").log = false;
- var shownCards = cards.filter(i => get.position(i) == "e"),
- handcardsLength = cards.length - shownCards.length;
- if (shownCards.length) {
- player.$throw(shownCards, null);
- game.log(player, "将", shownCards, "置于了牌堆底");
- }
- if (handcardsLength > 0) {
- player.$throw(handcardsLength, null);
- game.log(player, "将", get.cnNumber(handcardsLength), "张牌置于了牌堆底");
- }
- game.delayex();
- var viewAs = new lib.element.VCard({ name: event.result.card.name, isCard: true });
- event.result.card = viewAs;
- event.result.cards = [];
- event.result._apply_args = {
- shanReq: cards.length,
- oncard: () => {
- var evt = get.event();
- for (var target of game.filterPlayer(null, null, true)) {
- var id = target.playerid;
- var map = evt.customArgs;
- if (!map[id]) map[id] = {};
- map[id].shanRequired = evt.shanReq;
- }
- },
- };
- },
- ai: {
- order: function (item, player) {
- return get.order({ name: "sha" }) + 0.1;
- },
- result: { player: 1 },
- keepdu: true,
- respondSha: true,
- skillTagFilter: (player, tag, arg) => {
- if (tag == "respondSha" && arg != "use") return false;
- },
- },
- },
- olchuming: {
- audio: 2,
- trigger: {
- source: "damageBegin1",
- player: "damageBegin3",
- },
- filter: function (event, player) {
- if (event.source === event.player) return false;
- if (!event.card || !event.cards || !event.cards.length) return true;
- let target = event[player === event.source ? "player" : "source"];
- return target && target.isIn();
- },
- forced: true,
- content: function* (event, map) {
- var player = map.player,
- trigger = map.trigger;
- if (!trigger.card || !trigger.cards || !trigger.cards.length) {
- trigger.num++;
- event.finish();
- return;
- } else {
- var target = trigger[trigger.source == player ? "player" : "source"];
- trigger._olchuming = true;
- target.addTempSkill("olchuming_effect");
- }
- },
- ai: {
- effect: {
- player: function (card, player, target) {
- if (!get.tag(card, "damage")) return;
- if (!lib.card[card.name] || !card.cards || !card.cards.length) return [1, 0, 1, -1];
- return [1, -1];
- },
- },
- },
- subSkill: {
- effect: {
- charlotte: true,
- trigger: { global: "phaseEnd" },
- forced: true,
- popup: false,
- content: function* (event, map) {
- var player = map.player;
- var mapx = {};
- var history = player.getHistory("damage").concat(player.getHistory("sourceDamage"));
- history.forEach(evt => {
- if (!evt._olchuming) return;
- var target = evt[evt.source == player ? "player" : "source"];
- if (!target.isIn()) return;
- var cards = evt.cards.filterInD("d");
- if (!cards.length) return;
- if (!mapx[target.playerid]) mapx[target.playerid] = [];
- mapx[target.playerid].addArray(cards);
- });
- var entries = Object.entries(mapx).map(entry => {
- return [(_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]], entry[1]];
- });
- if (!entries.length) {
- event.finish();
- return;
- }
- player.logSkill(
- "olchuming_effect",
- entries.map(i => i[0])
- );
- entries.sort((a, b) => lib.sort.seat(a[0], b[0]));
- for (var entry of entries) {
- var current = entry[0],
- cards = entry[1];
- var list = ["jiedao", "guohe"].filter(i => player.canUse(new lib.element.VCard({ name: i, cards: cards }), current, false));
- if (!list.length) return;
- var result = {};
- if (list.length == 1) result = { bool: true, links: [["", "", list[0]]] };
- else
- result = yield player
- .chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`, [list, "vcard"]], true)
- .set("ai", button => {
- var player = get.player();
- return get.effect(get.event("currentTarget"), { name: button.link[2] }, player, player);
- })
- .set("currentTarget", current);
- if (result.bool) {
- var card = get.autoViewAs({ name: result.links[0][2] }, cards);
- if (player.canUse(card, current, false)) player.useCard(card, cards, current, false);
- }
- }
- },
- },
- },
- },
- bingxin: {
- audio: 2,
- enable: "chooseToUse",
- hiddenCard: function (player, name) {
- if (get.type(name) == "basic" && lib.inpile.includes(name) && !player.getStorage("bingxin_count").includes(name)) return true;
- },
- filter: function (event, player) {
- if (event.type == "wuxie") return false;
- var hs = player.getCards("h");
- if (hs.length != Math.max(0, player.hp)) return false;
- if (hs.length > 1) {
- var color = get.color(hs[0], player);
- for (var i = 1; i < hs.length; i++) {
- if (get.color(hs[i], player) != color) return false;
- }
- }
- var storage = player.storage.bingxin_count;
- for (var i of lib.inpile) {
- if (get.type(i) != "basic") continue;
- if (storage && storage.includes(i)) continue;
- var card = { name: i, isCard: true };
- if (event.filterCard(card, player, event)) return true;
- if (i == "sha") {
- for (var j of lib.inpile_nature) {
- card.nature = j;
- if (event.filterCard(card, player, event)) return true;
- }
- }
- }
- return false;
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = [];
- var storage = player.storage.bingxin_count;
- for (var i of lib.inpile) {
- if (get.type(i) != "basic") continue;
- if (storage && storage.includes(i)) continue;
- var card = { name: i, isCard: true };
- if (event.filterCard(card, player, event)) list.push(["基本", "", i]);
- if (i == "sha") {
- for (var j of lib.inpile_nature) {
- card.nature = j;
- if (event.filterCard(card, player, event)) list.push(["基本", "", i, j]);
- }
- }
- }
- return ui.create.dialog("冰心", [list, "vcard"], "hidden");
- },
- check: function (button) {
- if (button.link[2] == "shan") return 3;
- var player = _status.event.player;
- if (button.link[2] == "jiu") {
- if (player.getUseValue({ name: "jiu" }) <= 0) return 0;
- if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" });
- return 0;
- }
- return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4;
- },
- backup: function (links, player) {
- return {
- selectCard: -1,
- filterCard: () => false,
- viewAs: {
- name: links[0][2],
- nature: links[0][3],
- isCard: true,
- },
- precontent: function () {
- player.logSkill("bingxin");
- player.draw();
- delete event.result.skill;
- var name = event.result.card.name;
- player.addTempSkill("bingxin_count");
- player.markAuto("bingxin_count", [name]);
- },
- };
- },
- prompt: function (links, player) {
- var name = links[0][2];
- var nature = links[0][3];
- return "摸一张并视为使用" + (get.translation(nature) || "") + get.translation(name);
- },
- },
- ai: {
- order: 10,
- respondShan: true,
- respondSha: true,
- skillTagFilter: function (player, tag, arg) {
- if (arg == "respond") return false;
- var hs = player.getCards("h");
- if (hs.length != Math.max(0, hs.length)) return false;
- if (hs.length > 1) {
- var color = get.color(hs[0], player);
- for (var i = 1; i < hs.length; i++) {
- if (get.color(hs[i], player) != color) return false;
- }
- }
- var storage = player.storage.bingxin_count;
- if (storage && storage.includes("s" + tag.slice(8))) return false;
- },
- result: {
- player: function (player) {
- if (_status.event.dying) return get.attitude(player, _status.event.dying);
- return 1;
- },
- },
- },
- subSkill: { count: { charlotte: true, onremove: true } },
- },
- zhefu: {
- audio: 2,
- trigger: { player: ["useCard", "respond"] },
- direct: true,
- filter: function (event, player) {
- return (
- player != _status.currentPhase &&
- game.hasPlayer(function (current) {
- return current != player && current.countCards("h") > 0;
- })
- );
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt("zhefu"), "令一名有手牌的其他角色弃置一张【" + get.translation(trigger.card.name) + "】,否则受到你造成的1点伤害。", function (card, player, target) {
- return target != player && target.countCards("h") > 0;
- })
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player) / Math.sqrt(target.countCards("h"));
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("zhefu", target);
- var name = trigger.card.name;
- target
- .chooseToDiscard("he", { name: name }, "弃置一张【" + get.translation(name) + "】或受到1点伤害")
- .set("ai", function (card) {
- var player = _status.event.player;
- if (_status.event.take || (get.name(card) == "tao" && !player.hasJudge("lebu"))) return 0;
- return 8 - get.value(card);
- })
- .set("take", get.damageEffect(target, player, target) >= 0);
- } else event.finish();
- "step 2";
- if (!result.bool) target.damage();
- },
- },
- yidu: {
- audio: 2,
- trigger: { player: "useCardAfter" },
- filter: function (event, player) {
- return (
- (event.card.name == "sha" || (get.type(event.card, null, false) == "trick" && get.tag(event.card, "damage") > 0)) &&
- event.targets.some(target => {
- return (
- target.countCards("h") > 0 &&
- !target.hasHistory("damage", function (evt) {
- return evt.card == event.card;
- })
- );
- })
- );
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt2("yidu"), (card, player, target) => {
- return _status.event.targets.includes(target);
- })
- .set(
- "targets",
- trigger.targets.filter(target => {
- return (
- target.countCards("h") > 0 &&
- !target.hasHistory("damage", function (evt) {
- return evt.card == trigger.card;
- })
- );
- })
- )
- .set("ai", target => {
- if (target.hasSkillTag("noh")) return 0;
- return -get.attitude(player, target);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.logSkill("yidu", target);
- player
- .choosePlayerCard(target, "遗毒:展示" + get.translation(target) + "的至多三张手牌", true, "h", [1, Math.min(3, target.countCards("h"))])
- .set("forceAuto", true)
- .set("ai", function (button) {
- if (ui.selected.buttons.length) return 0;
- return 1 + Math.random();
- });
- } else event.finish();
- "step 2";
- var cards = result.cards;
- player.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【遗毒】");
- var color = get.color(cards[0], target);
- var bool = true;
- for (var i = 1; i < cards.length; i++) {
- if (get.color(cards[i], target) != color) {
- bool = false;
- break;
- }
- }
- if (bool) target.discard(cards, "notBySelf").discarder = player;
- },
- },
- xinwanyi: {
- audio: "wanyi",
- trigger: { player: "useCardToTargeted" },
- filter: function (event, player) {
- return player != event.target && event.targets.length == 1 && (event.card.name == "sha" || get.type(event.card, false) == "trick") && event.target.countCards("he") > 0;
- },
- locked: false,
- logTarget: "target",
- check: function (event, player) {
- return get.effect(event.target, { name: "guohe_copy2" }, player, player) > 0;
- },
- prompt2: "将该角色的一张牌置于武将牌上作为“嫕”",
- content: function () {
- "step 0";
- event.target = trigger.target;
- player.choosePlayerCard(event.target, true, "he");
- "step 1";
- if (result.bool) {
- var cards = result.cards;
- player.addToExpansion(cards, target, "give").gaintag.add("xinwanyi");
- }
- },
- mod: {
- cardEnabled: function (card, player) {
- var cards = player.getExpansions("xinwanyi");
- if (cards.length) {
- var suit = get.suit(card);
- if (suit == "none") return;
- for (var i of cards) {
- if (get.suit(i, player) == suit) return false;
- }
- }
- },
- cardRespondable: function (card, player) {
- var cards = player.getExpansions("xinwanyi");
- if (cards.length) {
- var suit = get.suit(card);
- if (suit == "none") return;
- for (var i of cards) {
- if (get.suit(i, player) == suit) return false;
- }
- }
- },
- cardSavable: function (card, player) {
- var cards = player.getExpansions("xinwanyi");
- if (cards.length) {
- var suit = get.suit(card);
- if (suit == "none") return;
- for (var i of cards) {
- if (get.suit(i, player) == suit) return false;
- }
- }
- },
- cardDiscardable: function (card, player) {
- var cards = player.getExpansions("xinwanyi");
- if (cards.length) {
- var suit = get.suit(card);
- if (suit == "none") return;
- for (var i of cards) {
- if (get.suit(i, player) == suit) return false;
- }
- }
- },
- },
- marktext: "嫕",
- intro: {
- markcount: "expansion",
- content: "expansion",
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- group: "xinwanyi_give",
- subSkill: {
- give: {
- audio: "wanyi",
- trigger: { player: ["phaseJieshuBegin", "damageEnd"] },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return player.getExpansions("xinwanyi").length > 0;
- },
- content: function () {
- "step 0";
- player.chooseTarget(true, "婉嫕:令一名角色获得一张“嫕”").set("ai", function (target) {
- return get.attitude(_status.event.player, target);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.line(target, "green");
- var cards = player.getExpansions("xinwanyi");
- if (cards.length == 1) event._result = { bool: true, links: cards };
- else player.chooseButton(["令" + get.translation(target) + "获得一张“嫕”", cards], true);
- } else event.finish();
- "step 2";
- if (result.bool) {
- target.gain(result.links, player, "give");
- }
- },
- },
- },
- },
- xinxuanbei: {
- audio: "xuanbei",
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return game.hasPlayer(current => lib.skill.xinxuanbei.filterTarget(null, player, current));
- },
- filterTarget: function (card, player, target) {
- return target != player && target.countCards("hej") > 0;
- },
- content: function () {
- "step 0";
- player.choosePlayerCard(target, "hej", true);
- "step 1";
- if (result.bool) {
- var card = result.cards[0];
- var cardx = get.autoViewAs({ name: "sha" }, [card]);
- if ((get.position(card) != "j" && !game.checkMod(card, target, "unchanged", "cardEnabled2", target)) || !target.canUse(cardx, player, false)) event.finish();
- else {
- var next = target.useCard(cardx, [card], player, false);
- event.card = next.card;
- }
- } else event.finish();
- "step 2";
- var num = 1;
- if (
- player.hasHistory("damage", function (evt) {
- return evt.card == event.card;
- })
- )
- num++;
- player.draw(num);
- },
- ai: {
- order: 7,
- result: {
- player: function (player, target) {
- return get.effect(target, { name: "guohe_copy" }, player, player) + get.effect(player, { name: "sha" }, target, player);
- },
- },
- },
- },
- xiongshu: {
- audio: 2,
- trigger: { global: "phaseUseBegin" },
- direct: true,
- filter: function (event, player) {
- return player != event.player && event.player.countCards("h") > 0 && player.countCards("he") >= player.countMark("xiongshu_count");
- },
- content: function () {
- "step 0";
- event.target = trigger.player;
- var num = player.countMark("xiongshu_count");
- if (num > 0)
- player
- .chooseToDiscard("he", num, get.prompt("xiongshu", trigger.player), "弃置" + get.cnNumber(num) + "张牌并展示其一张手牌")
- .set("goon", get.attitude(player, event.target) < 0)
- .set("ai", function (card) {
- if (!_status.event.goon) return 0;
- return 6 - _status.event.player.countMark("xiongshu_count") - get.value(card);
- }).logSkill = ["xiongshu", trigger.player];
- else
- player
- .chooseBool(get.prompt("xiongshu", trigger.player), "展示其一张牌")
- .set("goon", get.attitude(player, event.target) < 0)
- .set("ai", function (card) {
- return _status.event.goon;
- });
- "step 1";
- if (result.bool) {
- if (!result.cards || !result.cards.length) player.logSkill("xiongshu", target);
- player.addTempSkill("xiongshu_count", "roundStart");
- player.addMark("xiongshu_count", 1, false);
- }
- if (result.bool && target.countCards("h") > 0) {
- player.choosePlayerCard(target, true, "h");
- } else event.finish();
- "step 2";
- var card = result.cards[0],
- name = get.name(card),
- str = get.translation(target);
- player.showCards(card, get.translation(player) + "对" + str + "发动了【凶竖】");
- player.addTempSkill("xiongshu_effect", "phaseUseAfter");
- player.storage.xiongshu_effect = [card, name];
- if (Math.random() < 0.5) {
- target.storage.xiongshu_ai = name;
- target.addTempSkill("xiongshu_ai", "phaseUseAfter");
- }
- player
- .chooseControl("会使用", "不会使用")
- .set("prompt", "预测:" + str + "是否会使用" + get.translation(name) + "?")
- .set(
- "choice",
- (function () {
- if (!target.hasValueTarget(card)) return 1;
- return Math.random() < 0.5 ? 0 : 1;
- })()
- )
- .set("ai", () => _status.event.choice);
- "step 3";
- player.storage.xiongshu_effect[2] = result.index == 0;
- },
- ai: { expose: 0.35 },
- subSkill: {
- ai: {
- charlotte: true,
- onremove: true,
- ai: {
- effect: {
- player: function (card, player, target) {
- if (card.name == player.storage.xiongshu_ai) return "zeroplayertarget";
- },
- },
- },
- },
- count: {
- charlotte: true,
- onremove: true,
- },
- effect: {
- trigger: { global: "phaseUseEnd" },
- forced: true,
- charlotte: true,
- onremove: true,
- filter: function (event, player) {
- var info = player.storage.xiongshu_effect;
- return Array.isArray(info) && event.player.isIn();
- },
- logTarget: "player",
- content: function () {
- var target = trigger.player;
- var info = player.storage.xiongshu_effect;
- var card = info[0];
- if (
- target.hasHistory("useCard", function (evt) {
- return evt.card.name == info[1] && evt.getParent("phaseUse") == trigger;
- }) == info[2]
- )
- target.damage();
- else {
- if (target.getCards("hej").includes(card)) player.gain(card, target, "give");
- else if (get.position(card, true) == "d") player.gain(card, "gain2");
- }
- },
- },
- },
- },
- jianhui: {
- audio: 2,
- getLastPlayer: function (evt, player) {
- var history = player.getAllHistory("damage");
- if (!history.length) return null;
- var i = history.indexOf(evt);
- if (i == -1) i = history.length - 1;
- else i--;
- for (i; i >= 0; i--) {
- if (history[i].source) return history[i].source;
- }
- return null;
- },
- trigger: { player: "damageEnd" },
- forced: true,
- filter: function (event, player) {
- return event.source && event.source.isIn() && event.source == lib.skill.jianhui.getLastPlayer(event, player) && event.source.countCards("he") > 0;
- },
- content: function () {
- trigger.source.chooseToDiscard("he", true);
- },
- group: "jianhui_draw",
- subSkill: {
- draw: {
- trigger: { source: "damageSource" },
- forced: true,
- logTarget: "player",
- filter: function (event, player) {
- return event.player == lib.skill.jianhui.getLastPlayer(event, player);
- },
- content: function () {
- player.draw();
- },
- },
- },
- },
- huaiyuan: {
- audio: 2,
- trigger: {
- player: "loseAfter",
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- filter: function (event, player) {
- var evt = event.getl(player);
- if (!evt || !evt.hs || !evt.hs.length) return false;
- if (event.name == "lose") {
- for (var i in event.gaintag_map) {
- if (event.gaintag_map[i].includes("huaiyuanx")) return true;
- }
- return false;
- }
- return player.hasHistory("lose", function (evt) {
- if (event != evt.getParent()) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("huaiyuanx")) return true;
- }
- return false;
- });
- },
- forced: true,
- locked: false,
- content: function () {
- "step 0";
- var num = 0;
- if (trigger.name == "lose") {
- for (var i in trigger.gaintag_map) {
- if (trigger.gaintag_map[i].includes("huaiyuanx")) num++;
- }
- } else
- player.getHistory("lose", function (evt) {
- if (trigger != evt.getParent()) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("huaiyuanx")) num++;
- }
- return false;
- });
- event.count = num;
- "step 1";
- event.count--;
- player.chooseTarget(true, "请选择【怀远】的目标", "令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。").set("ai", function (target) {
- var player = _status.event.player,
- att = get.attitude(player, target);
- if (att <= 0) return 0;
- if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) att *= 2.2;
- if (target.needsToDiscard()) att *= 1.3;
- return att * Math.sqrt(Math.max(1, 4 - target.countCards("h")));
- });
- "step 2";
- if (result.bool) {
- var target = result.targets[0];
- event.target = target;
- player.line(target, "green");
- var str = get.translation(target);
- player
- .chooseControl()
- .set("choiceList", ["令" + str + "的手牌上限+1", "令" + str + "的攻击范围+1", "令" + str + "摸一张牌"])
- .set("ai", function () {
- var player = _status.event.player,
- target = _status.event.getParent().target;
- if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) return 1;
- if (target.needsToDiscard()) return 0;
- return 2;
- });
- } else event.finish();
- "step 3";
- if (result.index == 2) target.draw();
- else {
- target.addSkill("huaiyuan_effect" + result.index);
- target.addMark("huaiyuan_effect" + result.index, 1, false);
- game.log(target, "的", "#g" + ["手牌上限", "攻击范围"][result.index], "+1");
- game.delayx();
- }
- if (event.count > 0) event.goto(1);
- },
- group: ["huaiyuan_init", "huaiyuan_die"],
- subSkill: {
- init: {
- audio: "huaiyuan",
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0;
- },
- content: function () {
- var hs = player.getCards("h");
- if (hs.length) player.addGaintag(hs, "huaiyuanx");
- },
- },
- die: {
- trigger: { player: "die" },
- direct: true,
- forceDie: true,
- skillAnimation: true,
- animationColor: "water",
- filter: function (event, player) {
- return player.hasMark("huaiyuan_effect0") || player.hasMark("huaiyuan_effect1");
- },
- content: function () {
- "step 0";
- var str = "令一名其他角色",
- num1 = player.countMark("huaiyuan_effect0"),
- num2 = player.countMark("huaiyuan_effect1");
- if (num1 > 0) {
- str += "手牌上限+";
- str += num1;
- if (num2 > 0) str += "且";
- }
- if (num2 > 0) {
- str += "攻击范围+";
- str += num2;
- }
- player
- .chooseTarget(lib.filter.notMe, get.prompt("huaiyuan"), str)
- .set("forceDie", true)
- .set("ai", function (target) {
- return get.attitude(_status.event.player, target) + 114514;
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("huaiyuan_die", target);
- var num1 = player.countMark("huaiyuan_effect0"),
- num2 = player.countMark("huaiyuan_effect1");
- if (num1 > 0) {
- target.addSkill("huaiyuan_effect0");
- target.addMark("huaiyuan_effect0", num1, false);
- }
- if (num2 > 0) {
- target.addSkill("huaiyuan_effect1");
- target.addMark("huaiyuan_effect1", num2, false);
- }
- game.delayx();
- }
- },
- },
- effect0: {
- charlotte: true,
- onremove: true,
- mod: {
- maxHandcard: function (player, num) {
- return num + player.countMark("huaiyuan_effect0");
- },
- },
- marktext: "怀",
- intro: { content: "手牌上限+#" },
- },
- effect1: {
- charlotte: true,
- onremove: true,
- mod: {
- attackRange: function (player, num) {
- return num + player.countMark("huaiyuan_effect1");
- },
- },
- marktext: "远",
- intro: { content: "攻击范围+#" },
- },
- },
- },
- chongxin: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return (
- player.countCards("he") > 0 &&
- game.hasPlayer(function (current) {
- return current != player && current.countCards("h") > 0;
- })
- );
- },
- filterCard: true,
- filterTarget: function (card, player, target) {
- return target != player && target.countCards("h") > 0;
- },
- check: function (card) {
- return 6 - get.value(card);
- },
- discard: false,
- lose: false,
- delay: false,
- position: "he",
- content: function () {
- "step 0";
- player.recast(cards);
- "step 1";
- if (target.countCards("he") > 0) {
- target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable);
- } else event.finish();
- "step 2";
- if (result.bool) {
- target.recast(result.cards);
- }
- },
- ai: {
- order: 6,
- result: {
- player: 1,
- target: function (player, target) {
- return 0.5 * Math.sqrt(Math.min(3, target.countCards("h")));
- },
- },
- },
- },
- dezhang: {
- trigger: { player: "phaseZhunbeiBegin" },
- derivation: "weishu",
- juexingji: true,
- forced: true,
- skillAnimation: true,
- animationColor: "thunder",
- filter: function (event, player) {
- return !player.hasCard(function (card) {
- return card.hasGaintag("huaiyuanx");
- }, "h");
- },
- content: function () {
- player.awakenSkill("dezhang");
- player.loseMaxHp();
- player.addSkills("weishu");
- },
- },
- weishu: {
- audio: 2,
- trigger: { player: "gainAfter" },
- forced: true,
- filter: function (event, player) {
- return event.getParent().name == "draw" && event.getParent(2).name != "weishu" && event.getParent("phaseDraw").player != player;
- },
- content: function () {
- "step 0";
- player.chooseTarget(true, "请选择【卫戍】的目标", "令一名角色摸一张牌").set("ai", function (target) {
- return get.attitude(_status.event.player, target) * Math.sqrt(Math.max(1, 4 - target.countCards("h")));
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.draw();
- }
- },
- group: "weishu_discard",
- subSkill: {
- discard: {
- trigger: {
- player: "loseAfter",
- global: "loseAsyncAfter",
- },
- forced: true,
- filter: function (event, player) {
- return event.type == "discard" && event.getParent(3).name != "weishu_discard" && event.getParent("phaseDiscard").player != player && event.getl(player).cards2.length > 0 && game.hasPlayer(target => target != player && target.countDiscardableCards(player, "he") > 0);
- },
- content: function () {
- "step 0";
- player
- .chooseTarget(true, "请选择【卫戍】的目标", "弃置一名其他角色的一张牌", function (card, player, target) {
- return target != player && target.countDiscardableCards(player, "he") > 0;
- })
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.effect(target, { name: "guohe_copy2" }, player, player);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- player.discardPlayerCard(target, "he", true);
- }
- },
- },
- },
- },
- gaoling: {
- audio: 2,
- trigger: { player: "showCharacterAfter" },
- hiddenSkill: true,
- filter: function (event, player) {
- return (
- event.toShow.includes("xuangongzhu") &&
- player != _status.currentPhase &&
- game.hasPlayer(function (current) {
- return current.isDamaged();
- })
- );
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt("gaoling"), "令一名角色回复1点体力", function (card, player, target) {
- return target.isDamaged();
- })
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.recoverEffect(target, player, player);
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("gaoling", target);
- target.recover();
- }
- },
- },
- qimei: {
- audio: 2,
- trigger: { player: "phaseZhunbeiBegin" },
- direct: true,
- preHidden: true,
- content: function () {
- "step 0";
- player
- .chooseTarget(get.prompt("qimei"), "选择一名其他角色并获得“齐眉”效果", lib.filter.notMe)
- .set("ai", function (target) {
- var player = _status.event.player;
- return get.attitude(player, target) / (Math.abs(player.countCards("h") + 2 - target.countCards("h")) + 1);
- })
- .setHiddenSkill("qimei");
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("qimei", target);
- player.storage.qimei_draw = target;
- player.addTempSkill("qimei_draw", { player: "phaseBegin" });
- game.delayx();
- }
- },
- subSkill: {
- draw: {
- audio: "qimei",
- charlotte: true,
- forced: true,
- popup: false,
- trigger: {
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "loseAfter", "addToExpansionAfter"],
- },
- usable: 1,
- filter: function (event, player) {
- var target = player.storage.qimei_draw;
- if (!target || !target.isIn()) return false;
- if (player.countCards("h") != target.countCards("h")) return false;
- var hasChange = function (event, player) {
- var gain = 0,
- lose = 0;
- if (event.getg) gain = event.getg(player).length;
- if (event.getl) lose = event.getl(player).hs.length;
- return gain != lose;
- };
- return hasChange(event, player) || hasChange(event, target);
- },
- content: function () {
- "step 0";
- if (trigger.delay === false) game.delayx();
- "step 1";
- var target = player.storage.qimei_draw;
- player.logSkill("qimei_draw", target);
- var drawer = [];
- var hasChange = function (event, player) {
- var gain = 0,
- lose = 0;
- if (event.getg) gain = event.getg(player).length;
- if (event.getl) lose = event.getl(player).hs.length;
- return gain != lose;
- };
- if (hasChange(trigger, player)) drawer.push(target);
- if (hasChange(trigger, target)) drawer.push(player);
- if (drawer.length == 1) drawer[0].draw();
- else {
- game.asyncDraw(drawer.sortBySeat());
- game.delayex();
- }
- },
- group: "qimei_hp",
- onremove: true,
- mark: "character",
- intro: { content: "已和$组成齐眉组合" },
- },
- hp: {
- audio: "qimei",
- trigger: { global: "changeHp" },
- charlotte: true,
- forced: true,
- logTarget: function (event, player) {
- return player.storage.qimei_draw;
- },
- usable: 1,
- filter: function (event, player) {
- var target = player.storage.qimei_draw;
- if (!target || !target.isIn()) return false;
- if (player != event.player && target != event.player) return false;
- return player.hp == target.hp;
- },
- content: function () {
- game.delayx();
- (player == trigger.player ? player.storage.qimei_draw : player).draw();
- },
- },
- },
- },
- ybzhuiji: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- direct: true,
- preHidden: true,
- content: function () {
- "step 0";
- var list = ["摸两张牌,并于出牌阶段结束时失去1点体力"];
- if (player.isDamaged()) list.push("回复1点体力,并于出牌阶段结束时弃置两张牌");
- player
- .chooseControl("cancel2")
- .set("choiceList", list)
- .set("prompt", get.prompt("ybzhuiji"))
- .set("ai", function () {
- var player = _status.event.player;
- if (player.isDamaged() && player.countCards("h", "tao") < player.getDamagedHp()) return 1;
- return "cancel2";
- })
- .setHiddenSkill("ybzhuiji");
- "step 1";
- if (result.control != "cancel2") {
- player.logSkill("ybzhuiji");
- if (result.index == 0) player.draw(2);
- else player.recover();
- player.addTempSkill("ybzhuiji_" + result.index, "phaseUseAfter");
- }
- },
- subSkill: {
- 0: {
- trigger: { player: "phaseUseEnd" },
- forced: true,
- charlotte: true,
- content: function () {
- player.loseHp();
- },
- },
- 1: {
- trigger: { player: "phaseUseEnd" },
- forced: true,
- charlotte: true,
- content: function () {
- player.chooseToDiscard("he", 2, true);
- },
- },
- },
- },
- canmou: {
- audio: 2,
- trigger: { global: "useCardToPlayer" },
- direct: true,
- filter: function (event, player) {
- if (!event.player.isMaxHandcard(true) || !event.isFirstTarget || get.type(event.card, null, false) != "trick") return false;
- var info = get.info(event.card);
- if (info.allowMultiple == false) return false;
- if (event.targets && !info.multitarget) {
- if (
- game.hasPlayer(function (current) {
- return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, event.player, current); //&&lib.filter.targetInRange(event.card,event.player,current);
- })
- ) {
- return true;
- }
- }
- return false;
- },
- preHidden: true,
- content: function () {
- "step 0";
- var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
- player
- .chooseTarget(get.prompt("canmou"), function (card, player, target) {
- var player = _status.event.source;
- return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); //&&lib.filter.targetInRange(_status.event.card,player,target);
- })
- .set("prompt2", prompt2)
- .set("ai", function (target) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.source;
- return get.effect(target, trigger.card, player, _status.event.player);
- })
- .set("targets", trigger.targets)
- .set("card", trigger.card)
- .set("source", trigger.player)
- .setHiddenSkill(event.name);
- "step 1";
- if (result.bool) {
- if (!event.isMine() && !event.isOnline()) game.delayx();
- event.targets = result.targets;
- } else {
- event.finish();
- }
- "step 2";
- if (event.targets) {
- player.logSkill(event.name, event.targets);
- trigger.targets.addArray(event.targets);
- game.log(event.targets, "也成为了", trigger.card, "的目标");
- }
- },
- },
- congjian: {
- audio: 2,
- trigger: { global: "useCardToTarget" },
- logTarget: "target",
- filter: function (event, player) {
- return event.target != player && event.targets.length == 1 && get.type(event.card, null, false) == "trick" && event.target.isMaxHp(true) && lib.filter.targetEnabled2(event.card, event.player, player);
- },
- check: function (event, player) {
- return get.effect(player, event.card, event.player, player) > 0;
- },
- preHidden: true,
- content: function () {
- trigger.targets.push(player);
- game.log(player, "也成为了", trigger.card, "的目标");
- var next = game.createEvent("congjian_draw", false);
- next.player = player;
- event.next.remove(next);
- trigger.getParent().after.push(next);
- next.setContent(function () {
- if (
- player.hasHistory("damage", function (evt) {
- return evt.card == event.parent.card;
- })
- )
- player.draw(2);
- });
- },
- },
- wanyi: {
- audio: 2,
- enable: "phaseUse",
- filter: function (event, player) {
- return (
- player.getStorage("wanyi2").length < 4 &&
- player.hasCard(function (i) {
- return get.is.yingbian(i);
- }, "hs")
- );
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = ["zhujinqiyuan", "chuqibuyi", "shuiyanqijunx", "dongzhuxianji"];
- list.removeArray(player.getStorage("wanyi2"));
- return ui.create.dialog("婉嫕", [list, "vcard"], "hidden");
- },
- filter: function (button, player) {
- return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent());
- },
- check: function (button) {
- return _status.event.player.getUseValue({ name: button.link[2] });
- },
- backup: function (links) {
- return {
- audio: "wanyi",
- popname: true,
- viewAs: {
- name: links[0][2],
- },
- filterCard: function (card) {
- return get.is.yingbian(card);
- },
- check: function (card) {
- return 1 / Math.max(1, get.value(card));
- },
- position: "hs",
- onuse: function (links, player) {
- if (!player.storage.wanyi2) player.storage.wanyi2 = [];
- player.storage.wanyi2.add(links.card.name);
- player.addTempSkill("wanyi2");
- },
- };
- },
- prompt: function (links) {
- return "将一张应变牌当做" + get.translation(links[0][2]) + "使用";
- },
- },
- subSkill: { backup: {} },
- ai: { order: 8, result: { player: 1 } },
- },
- wanyi2: { onremove: true },
- maihuo: {
- audio: 2,
- trigger: { target: "useCardToTargeted" },
- logTarget: "player",
- filter: function (event, player) {
- return event.card.name == "sha" && event.card.isCard && event.getParent(2).name != "maihuo_effect" && event.cards.filterInD().length > 0 && event.targets.length == 1 && event.player.isIn() && !event.player.getExpansions("maihuo_effect").length;
- },
- prompt2: function (event) {
- return "令" + get.translation(event.card) + "暂时对你无效";
- },
- check: function (event, player) {
- return get.effect(player, event.card, event.player, player) < 0;
- },
- content: function () {
- trigger.excluded.add(player);
- var target = trigger.player,
- cards = trigger.cards.filterInD();
- target.addToExpansion("gain2", cards).gaintag.add("maihuo_effect");
- target.storage.maihuo_target = player;
- target.addSkill("maihuo_effect");
- },
- group: "maihuo_damage",
- subSkill: {
- effect: {
- trigger: { player: "phaseUseBegin" },
- forced: true,
- charlotte: true,
- filter: function (event, player) {
- return player.getExpansions("maihuo_effect").length > 0;
- },
- content: function () {
- "step 0";
- var cards = player.getExpansions("maihuo_effect"),
- card = cards[0];
- if (card.name != "sha")
- card = get.autoViewAs(
- {
- name: "sha",
- isCard: true,
- },
- cards
- );
- var target = player.storage.maihuo_target;
- if (target.isIn() && player.canUse(card, target, null, true)) {
- player.useCard(card, target, cards);
- }
- "step 1";
- player.removeSkill("maihuo_effect");
- },
- marktext: "祸",
- intro: {
- content: "expansion",
- markcount: "expansion",
- },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- ai: { threaten: 1.05 },
- },
- damage: {
- trigger: { source: "damageSource" },
- forced: true,
- locked: false,
- filter: function (event, player) {
- return event.player.hasSkill("maihuo_effect") && event.player.getExpansions("maihuo_effect").length > 0;
- },
- content: function () {
- trigger.player.removeSkill("maihuo_effect");
- },
- },
- },
- },
- xuanbei: {
- audio: 2,
- trigger: {
- global: "phaseBefore",
- player: "enterGame",
- },
- filter: function (event, player) {
- return event.name != "phase" || game.phaseNumber == 0;
- },
- forced: true,
- locked: false,
- content: function () {
- var cards = [];
- while (cards.length < 2) {
- var card = get.cardPile2(function (i) {
- return get.is.yingbian(i) && !cards.includes(i);
- });
- if (!card) break;
- else cards.push(card);
- }
- if (cards.length) player.gain(cards, "gain2");
- },
- group: "xuanbei_give",
- subSkill: {
- give: {
- trigger: { player: "useCardAfter" },
- usable: 1,
- filter: function (event, player) {
- return (event.card.yingbian || get.is.yingbian(event.card)) && event.cards.filterInD().length > 0;
- },
- direct: true,
- content: function () {
- "step 0";
- event.cards = trigger.cards.filterInD();
- player.chooseTarget(get.prompt("xuanbei"), "令一名其他角色获得" + get.translation(event.cards), lib.filter.notMe).set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- if (att < 3) return 0;
- if (target.hasJudge("lebu")) att /= 2;
- if (target.hasSkillTag("nogain")) att /= 10;
- return att / (1 + get.distance(player, target, "absolute"));
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.logSkill("xuanbei_give", target);
- target.gain(cards, "gain2").giver = player;
- } else player.storage.counttrigger.xuanbei_give--;
- },
- ai: { expose: 0.1 },
- },
- },
- },
- xianwan: {
- audio: 2,
- enable: "chooseToUse",
- filter: function (event, player) {
- return (
- event.filterCard &&
- event.filterCard(
- {
- name: "sha" + (player.isLinked() ? "" : "n"),
- isCard: true,
- },
- player,
- event
- )
- );
- },
- viewAs: function (cards, player) {
- return {
- name: "sha" + (player.isLinked() ? "" : "n"),
- isCard: true,
- };
- },
- filterCard: () => false,
- selectCard: -1,
- prompt: "将武将牌重置并视为使用【杀】",
- log: false,
- check: () => 1,
- precontent: function () {
- player.logSkill("xianwan");
- player.link();
- },
- ai: {
- order: 3.4,
- respondSha: true,
- respondShan: true,
- skillTagFilter: function (player, tag) {
- return tag == "respondSha" + (player.isLinked() ? "" : "n");
- },
- effect: {
- target: function (card, player, target, current) {
- if (get.tag(card, "respondShan") && current < 0 && !player.isLinked()) return 0.4;
- },
- },
- },
- },
- recaiwang: {
- audio: "caiwang",
- inherit: "caiwang",
- group: ["recaiwang_hand", "recaiwang_equip", "recaiwang_judge"],
- },
- recaiwang_hand: {
- audio: "caiwang",
- enable: ["chooseToUse", "chooseToRespond"],
- viewAsFilter: function (player) {
- var js = player.getCards("h");
- return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player);
- },
- selectCard: -1,
- filterCard: true,
- position: "h",
- prompt: "将全部手牌当做【闪】使用",
- viewAs: { name: "shan" },
- check: card => 10 - get.value(card),
- ai: {
- order: 1,
- respondShan: true,
- skillTagFilter: function (player) {
- return player.countCards("h") == 1;
- },
- },
- },
- recaiwang_equip: {
- audio: "caiwang",
- enable: ["chooseToUse", "chooseToRespond"],
- viewAsFilter: function (player) {
- var js = player.getCards("e");
- return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player);
- },
- selectCard: -1,
- filterCard: true,
- check: card => 9 - get.value(card),
- position: "e",
- prompt: "将装备区的牌当做【无懈可击】使用",
- viewAs: { name: "wuxie" },
- ai: {
- order: 1,
- },
- },
- recaiwang_judge: {
- audio: "caiwang",
- enable: ["chooseToUse", "chooseToRespond"],
- viewAsFilter: function (player) {
- var js = player.getCards("j");
- return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player);
- },
- selectCard: -1,
- filterCard: true,
- position: "j",
- prompt: "将判定区的牌当做【杀】使用",
- viewAs: { name: "sha" },
- check: card => 1,
- locked: false,
- ai: {
- order: 10,
- respondSha: true,
- skillTagFilter: function (player) {
- return player.countCards("j") == 1;
- },
- effect: {
- target: function (card, player, target, current) {
- if (card && (card.name == "shandian" || card.name == "fulei") && player == target && !target.countCards("j") && target.isPhaseUsing() && target.hasValueTarget({ name: "sha" }, null, true)) return [1, 2];
- },
- },
- },
- mod: {
- aiOrder: function (player, card, num) {
- if (card.name == "shandian" || card.name == "fulei") return num + 3;
- },
- },
- },
- caozhao: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- if (
- player.countCards("h") == 0 ||
- !game.hasPlayer(function (current) {
- return current != player && current.hp <= player.hp;
- })
- )
- return false;
- var list = player.getStorage("caozhao");
- for (var i of lib.inpile) {
- if (!list.includes(i) && ["basic", "trick"].includes(get.type(i))) return true;
- }
- return false;
- },
- chooseButton: {
- dialog: function (event, player) {
- var list = player.getStorage("caozhao"),
- vcards = [];
- for (var i of lib.inpile) {
- if (!list.includes(i)) {
- var type = get.type(i);
- if (type == "basic" || type == "trick") vcards.push([type, "", i]);
- }
- }
- return ui.create.dialog("草诏", [vcards, "vcard"]);
- },
- check: function (button) {
- return _status.event.player.getUseValue({ name: button.link[2], isCard: true }, null, true);
- },
- backup: function (links, player) {
- return {
- audio: "caozhao",
- cardname: links[0][2],
- filterCard: true,
- position: "h",
- check: function (card) {
- return player.getUseValue({ name: lib.skill.caozhao_backup.cardname }) - (player.getUseValue(card, null, true) + 0.1) / (get.value(card) / 6);
- },
- filterTarget: function (card, player, target) {
- return target != player && target.hp <= player.hp;
- },
- discard: false,
- lose: false,
- content: function () {
- "step 0";
- player.showCards(cards, get.translation(player) + "发动【草诏】,声明" + get.translation(lib.skill.caozhao_backup.cardname));
- if (!player.storage.caozhao) player.storage.caozhao = [];
- player.storage.caozhao.push(lib.skill.caozhao_backup.cardname);
- "step 1";
- target
- .chooseControl()
- .set("choiceList", ["令" + get.translation(player) + "将" + get.translation(cards[0]) + "的牌名改为" + get.translation(lib.skill.caozhao_backup.cardname), "失去1点体力"])
- .set("ai", function (event, player) {
- var target = _status.event.getParent().player;
- if (get.attitude(player, target) > 0) return 0;
- if (player.hp > 3 || (player.hp > 1 && player.hasSkill("zhaxiang"))) return 1;
- if (player.hp > 2) return Math.random() > 0.5 ? 0 : 1;
- return 0;
- });
- "step 2";
- if (result.index == 1) {
- target.addExpose(0.2);
- target.loseHp();
- event.finish();
- } else {
- player.chooseTarget("是否将" + get.translation(lib.skill.caozhao_backup.cardname) + "(" + get.translation(cards[0]) + ")交给一名其他角色?", lib.filter.notMe).set("ai", () => -1);
- }
- "step 3";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- if (!target.storage.caozhao_info) target.storage.caozhao_info = {};
- target.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname;
- target.addSkill("caozhao_info");
- player.give(cards, target, "give").gaintag.add("caozhao");
- } else {
- if (!player.storage.caozhao_info) player.storage.caozhao_info = {};
- player.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname;
- player.addGaintag(cards, "caozhao");
- player.addSkill("caozhao_info");
- }
- },
- ai: {
- result: {
- player: 2,
- target: 0.1,
- },
- },
- };
- },
- prompt: function (links, player) {
- return "将一张手牌声明为" + get.translation(links[0][2]);
- },
- },
- ai: {
- order: 1,
- result: {
- player: 1,
- },
- },
- },
- caozhao_info: {
- charlotte: true,
- mod: {
- cardname: function (card, player) {
- var map = player.storage.caozhao_info;
- if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return map[card.cardid];
- },
- cardnature: function (card, player) {
- var map = player.storage.caozhao_info;
- if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return false;
- },
- },
- },
- olxibing: {
- audio: 2,
- trigger: { player: "damageEnd" },
- filter: function (event, player) {
- return event.player && event.source && event.player != event.source && event.player.isAlive() && event.source.isAlive() && (event.player.countCards("he") > 0 || event.source.countCards("he") > 0);
- },
- direct: true,
- content: function () {
- "step 0";
- var target = trigger.source;
- event.target = target;
- player
- .chooseTarget(get.prompt("olxibing"), "弃置自己或" + get.translation(target) + "的两张牌,然后手牌数较少的角色摸两张牌且不能对你使用牌直到回合结束", function (card, player, target) {
- if (target != player && target != _status.event.target) return false;
- return target.countCards("he") > 0;
- })
- .set("target", target)
- .set("ai", function (targetx) {
- var player = _status.event.player,
- target = _status.event.target;
- if (target == targetx) {
- if (get.attitude(player, target) > 0) return 0;
- var cards = target
- .getCards("he", function (card) {
- return lib.filter.canBeDiscarded(card, player, target);
- })
- .sort(function (a, b) {
- return get.buttonValue(b) - get.buttonValue(a);
- });
- if (
- target.countCards("h") - player.countCards("h") >=
- Math.max(
- 0,
- Math.min(2, cards.length) -
- target.countCards("e", function (card) {
- var index = cards.indexOf(card);
- return index != -1 && index < 2;
- })
- )
- )
- return 1;
- return 0;
- }
- var cards = player
- .getCards("he", function (card) {
- return lib.filter.cardDiscardable(card, player, "olxibing");
- })
- .sort(function (a, b) {
- return get.useful(a) - get.useful(b);
- });
- if (
- player.countCards("h") - target.countCards("h") <
- Math.max(
- 0,
- Math.min(cards.length, 2) -
- player.countCards("e", function (card) {
- var index = cards.indexOf(card);
- return index != -1 && index < 2;
- })
- ) &&
- (cards.length < 2 || get.value(cards[1]) < 5.5)
- )
- return 0.8;
- return 0;
- });
- "step 1";
- if (result.bool) {
- player.logSkill("olxibing", target);
- var target = result.targets[0];
- if (target == player) player.chooseToDiscard("he", 2, true);
- else player.discardPlayerCard(target, "he", true, 2);
- } else event.finish();
- "step 2";
- if (player.isIn() && target.isIn()) {
- var hs = player.countCards("h"),
- ts = target.countCards("h");
- if (hs != ts) {
- var drawer = hs > ts ? target : player;
- drawer.draw(2);
- player.addTempSkill("olxibing2");
- player.markAuto("olxibing2", [drawer]);
- }
- }
- },
- },
- olxibing2: {
- mod: {
- targetEnabled: function (card, player, target) {
- if (target.getStorage("olxibing2").includes(player)) return false;
- },
- cardSavable: function (card, player, target) {
- if (target.getStorage("olxibing2").includes(player)) return false;
- },
- },
- onremove: true,
- },
- bolan: {
- audio: 2,
- banned: ["kotomi_chuanxiang"],
- global: "bolan_g",
- initList: function (player) {
- var list,
- skills = [];
- if (get.mode() == "guozhan") {
- list = [];
- for (var i in lib.characterPack.mode_guozhan) {
- if (lib.character[i]) list.push(i);
- }
- } else if (_status.connectMode) list = get.charactersOL();
- else {
- list = [];
- for (var i in lib.character) {
- if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue;
- list.push(i);
- }
- }
- for (var i of list) {
- if (i.indexOf("gz_jun") == 0) continue;
- for (var j of lib.character[i][3]) {
- if (j == "bolan") continue;
- var skill = lib.skill[j];
- if (!skill || skill.juexingji || skill.hiddenSkill || skill.zhuSkill || skill.dutySkill || skill.chargeSkill || lib.skill.bolan.banned.includes(j)) continue;
- if (skill.init || (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg))) continue;
- var info = lib.translate[j + "_info"];
- if (info && info.indexOf("出牌阶段限一次") != -1) skills.add(j);
- }
- }
- player.storage.bolan = skills;
- },
- check: function (event, player) {
- return true;
- },
- trigger: { player: "phaseUseBegin" },
- frequent: true,
- preHidden: true,
- content: function () {
- "step 0";
- if (player.isIn()) {
- if (!player.storage.bolan) lib.skill.bolan.initList(player);
- var list = player.storage.bolan.randomGets(3);
- if (!list.length) {
- event.finish();
- return;
- }
- player
- .chooseControl(list)
- .set(
- "choiceList",
- list.map(function (i) {
- return '【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
" + get.skillInfoTranslation(i, player) + "
";
- })
- )
- .set("displayIndex", false)
- .set("prompt", "博览:请选择你要获得的技能")
- .set("ai", () => {
- var list = _status.event.controls.slice();
- return list.sort((a, b) => {
- return get.skillRank(b, "in") - get.skillRank(a, "in");
- })[0];
- });
- } else event.finish();
- "step 1";
- player.addTempSkills(result.control, "phaseUseEnd");
- player.popup(result.control);
- // game.log(player,'获得了','#g【'+get.translation(result.control)+'】');
- },
- ai: { threaten: 0.9 },
- subSkill: {
- g: {
- audio: "bolan",
- forceaudio: true,
- enable: "phaseUse",
- usable: 1,
- prompt: "出牌阶段限一次。你可以令一名有〖博览〗的角色从三个描述中包含“出牌阶段限一次”的技能中选择一个,你获得此技能直到此阶段结束。",
- filter: function (event, player) {
- return game.hasPlayer(function (current) {
- return current != player && current.hasSkill("bolan");
- });
- },
- filterTarget: function (card, player, target) {
- return player != target && target.hasSkill("bolan");
- },
- selectTarget: function () {
- if (
- game.countPlayer(current => {
- return lib.skill.bolan_g.filterTarget(null, _status.event.player, current);
- }) == 1
- )
- return -1;
- return 1;
- },
- content: function () {
- "step 0";
- player.loseHp();
- "step 1";
- if (target.isIn() && player.isIn()) {
- if (!target.storage.bolan) lib.skill.bolan.initList(target);
- var list = target.storage.bolan.randomGets(3);
- if (!list.length) {
- event.finish();
- return;
- }
- target
- .chooseControl(list)
- .set(
- "choiceList",
- list.map(function (i) {
- return '【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
" + get.skillInfoTranslation(i, player) + "
";
- })
- )
- .set("displayIndex", false)
- .set("prompt", "博览:请选择令" + get.translation(player) + "获得的技能")
- .set("ai", () => {
- var list = _status.event.controls.slice();
- return list.sort((a, b) => {
- return (get.skillRank(b, "in") - get.skillRank(a, "in")) * get.attitude(_status.event.player, _status.event.getParent().player);
- })[0];
- });
- } else event.finish();
- "step 2";
- target.line(player);
- player.addTempSkills(result.control, "phaseUseEnd");
- player.popup(result.control);
- },
- ai: {
- order: function (item, player) {
- if (player.hp >= 5 || player.countCards("h") >= 10) return 10;
- var list = game.filterPlayer(current => lib.skill.bolan_g.filterTarget(null, player, current));
- for (var target of list) {
- if (get.attitude(target, player) > 0) return 10;
- }
- return 4;
- },
- result: {
- player: function (player, target) {
- if (player.hasUnknown()) return player.hp + player.countCards("h") / 4 - 5 > 0 ? 1 : 0;
- var tao = player.countCards("h", "tao");
- if (player.hp + tao > 4) return 4 + get.attitude(player, target);
- if (player.hp + tao > 3) return get.attitude(player, target) - 2;
- return 0;
- },
- },
- },
- },
- },
- },
- yifa: {
- audio: 2,
- trigger: { target: "useCardToTargeted" },
- forced: true,
- logTarget: "player",
- filter: function (event, player) {
- return player != event.player && (event.card.name == "sha" || (get.color(event.card) == "black" && get.type(event.card) == "trick"));
- },
- content: function () {
- var target = trigger.player;
- target.addTempSkill("yifa2", { player: "phaseEnd" });
- target.addMark("yifa2", 1, false);
- },
- ai: { threaten: 0.8 },
- },
- yifa2: {
- charlotte: true,
- onremove: true,
- intro: { content: "手牌上限-#" },
- mod: {
- maxHandcard: function (player, num) {
- return num - player.countMark("yifa2");
- },
- },
- },
- buchen: {
- audio: 2,
- trigger: { player: "showCharacterAfter" },
- hiddenSkill: true,
- filter: function (event, player) {
- var target = _status.currentPhase;
- return event.toShow.includes("jin_simayi") && target && target != player && target.countGainableCards(player, "he") > 0;
- },
- direct: true,
- content: function () {
- var target = _status.currentPhase;
- player.gainPlayerCard(target, "he", get.prompt("buchen", target)).set("logSkill", ["buchen", target]);
- },
- },
- smyyingshi: {
- audio: 2,
- enable: "phaseUse",
- locked: true,
- filter: function (event, player) {
- return Array.isArray(event.smyyingshi);
- },
- onChooseToUse: function (event) {
- if (game.online || !event.player.hasSkill("smyyingshi")) return;
- var cards = [];
- for (var i = 0; i < event.player.maxHp; i++) {
- var card = ui.cardPile.childNodes[i];
- if (card) cards.push(card);
- else break;
- }
- event.set("smyyingshi", cards);
- },
- chooseButton: {
- dialog: function (event) {
- var dialog = ui.create.dialog("鹰视", "hidden");
- if (event.smyyingshi && event.smyyingshi.length) dialog.add(event.smyyingshi);
- else dialog.addText("牌堆无牌");
- for (var i of dialog.buttons) {
- i.classList.add("noclick");
- }
- dialog.buttons.length = 0;
- return dialog;
- },
- filter: function () {
- return false;
- },
- },
- },
- xiongzhi: {
- audio: 2,
- enable: "phaseUse",
- limited: true,
- skillAnimation: true,
- animationColor: "thunder",
- content: function () {
- "step 0";
- player.awakenSkill("xiongzhi");
- "step 1";
- var card = get.cards()[0];
- event.card = card;
- player.showCards(card);
- if (!player.hasUseTarget(card)) {
- card.fix();
- ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
- game.updateRoundNumber();
- event.finish();
- }
- "step 2";
- var next = player.chooseUseTarget(card, true);
- if (get.info(card).updateUsable == "phaseUse") next.addCount = false;
- "step 3";
- if (result.bool) event.goto(1);
- else {
- card.fix();
- ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
- game.updateRoundNumber();
- }
- },
- ai: {
- order: 1,
- result: {
- player: function (player) {
- if (!player.hasSkill("smyyingshi")) return 1;
- var cards = [];
- for (var i = 0; i < Math.min(2, player.maxHp); i++) {
- var card = ui.cardPile.childNodes[i];
- if (card) {
- if (!player.hasValueTarget(card)) return 0;
- } else break;
- }
- return 1;
- },
- },
- },
- },
- quanbian: {
- audio: 2,
- trigger: { player: ["useCard", "respond"] },
- hasHand: function (event) {
- var evts = event.player.getHistory("lose", function (evt) {
- return evt.getParent() == event;
- });
- return evts && evts.length == 1 && evts[0].hs.length > 0;
- },
- filter: function (event, player) {
- var phase = event.getParent("phaseUse");
- if (!phase || phase.player != player) return false;
- var suit = get.suit(event.card);
- if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false;
- return (
- player.getHistory("useCard", function (evt) {
- return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
- }).length +
- player.getHistory("respond", function (evt) {
- return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
- }).length ==
- 0
- );
- },
- direct: true,
- content: function () {
- "step 0";
- player
- .chooseControl("cancel2")
- .set("prompt", get.prompt("quanbian"))
- .set("choiceList", ["摸一张牌", "观看牌堆顶的" + get.cnNumber(player.maxHp) + "张牌并将其中一张置于牌堆底"])
- .set("ai", function () {
- var player = _status.event.player;
- var suit = get.suit(_status.event.getTrigger().card);
- if (
- player.countCards("h", function (card) {
- return get.suit(card) == suit && player.hasValueTarget(card, null, true);
- })
- )
- return "cancel2";
- return 0;
- });
- "step 1";
- if (result.control == "cancel2") {
- event.finish();
- return;
- }
- player.addTempSkill("quanbian2");
- player.storage.quanbian2.add(get.suit(trigger.card));
- player.markSkill("quanbian2");
- if (result.index == 0) {
- player.draw();
- event.finish();
- return;
- }
- event.cards = get.cards(player.maxHp);
- player.chooseButton(["将一张牌置于牌堆底", event.cards], true);
- "step 2";
- while (cards.length) {
- var card = cards.pop();
- card.fix();
- if (card == result.links[0]) ui.cardPile.appendChild(card);
- else ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
- }
- game.updateRoundNumber();
- },
- },
- quanbian2: {
- init: function (player, skill) {
- if (!player.storage[skill]) player.storage[skill] = [];
- },
- onremove: true,
- mod: {
- cardEnabled2: function (card, player) {
- if (get.position(card) == "h" && player.storage.quanbian2.includes(get.suit(card))) return false;
- },
- },
- intro: {
- content: "本回合内不能使用$花色的手牌",
- },
- },
- //卫瓘
- zhongyun: {
- audio: 2,
- trigger: { player: ["damageEnd", "recoverEnd"] },
- forced: true,
- filter: function (event, player) {
- return (
- player.hp == player.countCards("h") &&
- (player.isDamaged() ||
- game.hasPlayer(function (current) {
- return player.inRange(current);
- }))
- );
- },
- usable: 1,
- preHidden: ["zhongyun2"],
- content: function () {
- "step 0";
- var filterTarget = function (card, player, target) {
- return player.inRange(target);
- };
- if (game.hasPlayer(current => filterTarget("L∞pers", player, current))) {
- var bool = player.isHealthy();
- player.chooseTarget("忠允:对攻击范围内的一名角色造成1点伤害" + (bool ? "" : ",或点取消回复1点体力"), filterTarget, bool).set("ai", function (target) {
- var player = _status.event.player;
- return get.damageEffect(target, player, player);
- });
- } else event._result = { bool: false };
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- target.damage();
- } else player.recover();
- },
- group: "zhongyun2",
- },
- zhongyun2: {
- audio: "zhongyun",
- trigger: {
- player: ["loseAfter"],
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- forced: true,
- filter: function (event, player) {
- var cards1 = event.getl(player).hs,
- cards2 = [];
- if (event.getg) cards2 = event.getg(player);
- return (cards1.length > 0 || cards2.length > 0) && player.countCards("h") == player.hp;
- },
- usable: 1,
- content: function () {
- "step 0";
- if (trigger.delay === false) game.delayx();
- var filterTarget = function (card, player, target) {
- return target != player && target.countDiscardableCards(player, "he") > 0;
- };
- if (!game.hasPlayer(current => filterTarget("L∞pers", player, current))) event._result = { bool: false };
- else
- player.chooseTarget(filterTarget, "忠允:弃置一名其他角色的一张牌,或点取消摸一张牌").set("ai", function (target) {
- var att = get.attitude(player, target);
- if (att >= 0) return 0;
- if (
- target.countCards("he", function (card) {
- return get.value(card) > 5;
- })
- )
- return -att;
- return 0;
- });
- "step 1";
- if (!result.bool) player.draw();
- else {
- var target = result.targets[0];
- player.line(target, "green");
- player.discardPlayerCard(target, true, "he");
- }
- },
- },
- shenpin: {
- audio: 2,
- trigger: { global: "judge" },
- filter: function (event, player) {
- var color = get.color(event.player.judging[0], event.player);
- return (
- player.countCards("hes", function (card) {
- if (_status.connectMode && get.position(card) != "e") return true;
- return get.color(card) != color;
- }) > 0
- );
- },
- direct: true,
- preHidden: true,
- content: function () {
- "step 0";
- var color = get.color(trigger.player.judging[0], trigger.player);
- player
- .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("shenpin"), "hes", function (card) {
- if (get.color(card) == _status.event.color) return false;
- var player = _status.event.player;
- var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
- if (mod2 != "unchanged") return mod2;
- var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player);
- if (mod != "unchanged") return mod;
- return true;
- })
- .set("ai", function (card) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.player;
- var judging = _status.event.judging;
- var result = trigger.judge(card) - trigger.judge(judging);
- var attitude = get.attitude(player, trigger.player);
- if (attitude == 0 || result == 0) return 0;
- if (attitude > 0) {
- return result;
- } else {
- return -result;
- }
- })
- .set("judging", trigger.player.judging[0])
- .set("color", color)
- .setHiddenSkill(event.name);
- "step 1";
- if (result.bool) {
- player.respond(result.cards, "highlight", "shenpin", "noOrdering");
- } else {
- event.finish();
- }
- "step 2";
- if (result.bool) {
- if (trigger.player.judging[0].clone) {
- trigger.player.judging[0].clone.classList.remove("thrownhighlight");
- game.broadcast(function (card) {
- if (card.clone) {
- card.clone.classList.remove("thrownhighlight");
- }
- }, trigger.player.judging[0]);
- game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone]));
- }
- game.cardsDiscard(trigger.player.judging[0]);
- trigger.player.judging[0] = result.cards[0];
- trigger.orderingCards.addArray(result.cards);
- game.log(trigger.player, "的判定牌改为", result.cards[0]);
- game.delay(2);
- }
- },
- ai: {
- rejudge: true,
- tag: {
- rejudge: 1,
- },
- },
- },
- //彻里吉
- chexuan: {
- audio: 2,
- enable: "phaseUse",
- derivation: ["cheliji_sichengliangyu", "cheliji_tiejixuanyu", "cheliji_feilunzhanyu"],
- filter: function (event, player) {
- return !player.getEquips(5).length && player.countCards("he", { color: "black" }) > 0;
- },
- filterCard: { color: "black" },
- position: "he",
- check: function (card) {
- return 5 - get.value(card);
- },
- content: function () {
- "step 0";
- player
- .chooseButton(
- [
- "请选择要装备的宝物",
- [
- lib.skill.chexuan.derivation.map(function (i) {
- return ["宝物", "", i];
- }),
- "vcard",
- ],
- ],
- true
- )
- .set("ai", function (button) {
- if (button.link[2] == "cheliji_sichengliangyu" && player.countCards("h") < player.hp) return 1;
- return Math.random();
- });
- "step 1";
- var name = result.links[0][2],
- card = game.createCard(name, lib.card[name].cardcolor, 5);
- player.$gain2(card);
- player.equip(card);
- game.delay();
- },
- group: "chexuan_lose",
- subfrequent: ["lose"],
- ai: {
- order: 6,
- result: {
- player: 1,
- },
- },
- subSkill: {
- lose: {
- audio: "chexuan",
- trigger: {
- player: "loseAfter",
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- frequent: true,
- filter: function (event, player) {
- var evt = event.getl(player);
- if (!evt || !evt.es || !evt.es.length) return false;
- if (event.name == "equip" && event.player == player) return false;
- for (var i of evt.es) {
- if (get.subtype(i, false) == "equip5") return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- player.judge(function (card) {
- if (get.color(card) == "black") return 3;
- return 0;
- });
- "step 1";
- if (result.bool) {
- var card = game.createCard(lib.skill.chexuan.derivation.randomGet());
- player.$gain2(card);
- player.equip(card);
- game.delay();
- }
- },
- },
- },
- },
- qiangshou: {
- mod: {
- globalFrom: function (player, target, distance) {
- if (player.getEquips(5).length) return distance - 1;
- },
- },
- },
- cheliji_sichengliangyu: {
- trigger: { global: "phaseJieshuBegin" },
- equipSkill: true,
- cardcolor: "heart",
- filter: function (event, player) {
- return player.countCards("h") < player.hp && player.getEquip("cheliji_sichengliangyu");
- },
- content: function () {
- "step 0";
- player.draw(2);
- "step 1";
- var card = player.getEquip("cheliji_sichengliangyu");
- if (card) player.discard(card);
- },
- },
- cheliji_tiejixuanyu: {
- trigger: { global: "phaseJieshuBegin" },
- equipSkill: true,
- cardcolor: "club",
- filter: function (event, player) {
- return player != event.player && !event.player.getHistory("sourceDamage").length && event.player.countCards("he") > 0 && player.getEquip("cheliji_tiejixuanyu");
- },
- logTarget: "player",
- check: function (event, player) {
- return get.attitude(player, event.player) < 0;
- },
- content: function () {
- "step 0";
- trigger.player.chooseToDiscard("he", 2, true);
- "step 1";
- var card = player.getEquip("cheliji_tiejixuanyu");
- if (card) player.discard(card);
- },
- },
- cheliji_feilunzhanyu: {
- trigger: { global: "phaseJieshuBegin" },
- equipSkill: true,
- cardcolor: "spade",
- filter: function (event, player) {
- return (
- player != event.player &&
- event.player.getHistory("useCard", function (card) {
- return get.type(card.card) != "basic";
- }).length > 0 &&
- event.player.countCards("he") > 0 &&
- player.getEquip("cheliji_feilunzhanyu")
- );
- },
- logTarget: "player",
- check: function (event, player) {
- return get.attitude(player, event.player) <= 0;
- },
- content: function () {
- "step 0";
- trigger.player.chooseCard("he", true, "将一张牌交给" + get.translation(player));
- "step 1";
- if (result.bool) trigger.player.give(result.cards, player);
- "step 2";
- var card = player.getEquip("cheliji_feilunzhanyu");
- if (card) player.discard(card);
- },
- },
- //司马伷和黄祖
- caiwang: {
- audio: 2,
- trigger: { global: ["useCard", "respond"] },
- preHidden: true,
- filter: function (event, player) {
- if (!Array.isArray(event.respondTo) || event.respondTo[0] == event.player || ![event.respondTo[0], event.player].includes(player)) return false;
- var color = get.color(event.card);
- if (color == "none" || get.color(event.respondTo[1]) != color) return false;
- var target = lib.skill.caiwang.logTarget(event, player);
- return target[player.getStorage("naxiang2").includes(target) ? "countGainableCards" : "countDiscardableCards"](player, "he") > 0;
- },
- logTarget: function (event, player) {
- return player == event.respondTo[0] ? event.player : event.respondTo[0];
- },
- prompt2: function (event, player) {
- var target = lib.skill.caiwang.logTarget(event, player);
- return (player.getStorage("naxiang2").includes(target) ? "获得" : "弃置") + "该角色的一张牌";
- },
- check: function (event, player) {
- return get.attitude(player, lib.skill.caiwang.logTarget(event, player)) <= 0;
- },
- popup: false,
- content: function () {
- "step 0";
- if (player != game.me && !player.isOnline()) game.delayx();
- "step 1";
- var target = lib.skill.caiwang.logTarget(trigger, player);
- player.logSkill(event.name, target);
- player[player.getStorage("naxiang2").includes(target) ? "gainPlayerCard" : "discardPlayerCard"](target, "he", true);
- },
- },
- naxiang: {
- audio: 2,
- trigger: {
- player: "damageEnd",
- source: "damageSource",
- },
- forced: true,
- preHidden: true,
- filter: function (event, player) {
- var target = lib.skill.naxiang.logTarget(event, player);
- return target && target != player && target.isAlive();
- },
- logTarget: function (event, player) {
- return player == event.player ? event.source : event.player;
- },
- content: function () {
- player.addTempSkill("naxiang2", { player: "phaseBegin" });
- if (!player.storage.naxiang2) player.storage.naxiang2 = [];
- player.storage.naxiang2.add(lib.skill.naxiang.logTarget(trigger, player));
- player.markSkill("naxiang2");
- },
- ai: {
- combo: "caiwang",
- },
- },
- naxiang2: {
- onremove: true,
- intro: {
- content: "已接受$的投降;对这些角色发动【才望】时将“弃置”改为“获得”",
- },
- },
- //李肃
- qiaoyan: {
- trigger: { player: "damageBegin2" },
- forced: true,
- filter: function (event, player) {
- return player != _status.currentPhase && event.source && event.source != player;
- },
- logTarget: "source",
- content: function () {
- "step 0";
- var cards = player.getExpansions("qiaoyan");
- if (cards.length) {
- var source = trigger.source;
- source.gain(cards, player, "give", "bySelf");
- event.finish();
- } else {
- trigger.cancel();
- player.draw();
- }
- "step 1";
- var hs = player.getCards("he");
- if (!hs.length) event.finish();
- else if (hs.length == 1) event._result = { bool: true, cards: hs };
- else player.chooseCard("he", true, "将一张牌作为“珠”置于武将牌上");
- "step 2";
- if (result.bool && result.cards && result.cards.length) {
- var cards = result.cards;
- player.addToExpansion(cards, player, "give").gaintag.add("qiaoyan");
- }
- event.finish();
- },
- marktext: "珠",
- intro: { content: "expansion", markcount: "expansion" },
- onremove: function (player, skill) {
- var cards = player.getExpansions(skill);
- if (cards.length) player.loseToDiscardpile(cards);
- },
- ai: {
- filterDamage: true,
- skillTagFilter: function (player, tag, arg) {
- if (!player.getExpansions("qiaoyan").length) return false;
- if (arg && arg.player) {
- if (arg.player.hasSkillTag("jueqing", false, player)) return false;
- }
- },
- },
- },
- xianzhu: {
- trigger: { player: "phaseUseBegin" },
- locked: true,
- filter: function (event, player) {
- return player.getExpansions("qiaoyan").length > 0;
- },
- async cost(event, trigger, player) {
- event.cards = player.getExpansions("qiaoyan");
- event.result = await player
- .chooseTarget(true, "请选择【献珠】的目标", "将" + get.translation(event.cards) + "交给一名角色。若该角色不为你自己,则你令其视为对其攻击范围内的另一名角色使用【杀】")
- .set("ai", function (target) {
- var player = _status.event.player;
- var eff = get.sgn(get.attitude(player, target)) * get.value(_status.event.getParent().cards[0], target);
- if (player != target)
- eff += Math.max.apply(
- null,
- game
- .filterPlayer(function (current) {
- if (current != target && player.inRange(current) && target.canUse("sha", current, false)) return true;
- })
- .map(function (current) {
- return get.effect(current, { name: "sha" }, target, player);
- })
- );
- return eff;
- })
- .forResult();
- },
- content: function () {
- "step 0";
- event.cards = player.getExpansions("qiaoyan");
- event.target = targets[0];
- "step 1";
- player.give(cards, target, "give");
- "step 2";
- if (
- player != target &&
- target.isIn() &&
- player.isIn() &&
- game.hasPlayer(function (current) {
- return current != target && player.inRange(current) && target.canUse("sha", current, false);
- })
- ) {
- var str = get.translation(target);
- player
- .chooseTarget(true, "选择攻击范围内的一名角色,视为" + str + "对其使用【杀】", function (card, player, target) {
- var source = _status.event.target;
- return player.inRange(target) && source.canUse("sha", target, false);
- })
- .set("target", target)
- .set("ai", function (target) {
- var evt = _status.event;
- return get.effect(target, { name: "sha" }, evt.target, evt.player);
- });
- } else event.finish();
- "step 3";
- if (result.bool) target.useCard({ name: "sha", isCard: true }, result.targets[0], false);
- },
- ai: { combo: "qiaoyan" },
- },
- huirong: {
- trigger: { player: "showCharacterAfter" },
- forced: true,
- filter: function (event, player) {
- return (
- event.toShow &&
- event.toShow.includes("jin_yanghuiyu") &&
- game.hasPlayer(function (target) {
- var num = target.countCards("h");
- return num > target.hp || num < Math.min(5, target.hp);
- })
- );
- },
- hiddenSkill: true,
- content: function () {
- "step 0";
- player
- .chooseTarget("请选择【慧容】的目标", "令一名角色将手牌数摸至/弃置至与其体力值相同(至多摸至五张)", true, function (card, player, target) {
- var num = target.countCards("h");
- return num > target.hp || num < Math.min(5, target.hp);
- })
- .set("ai", function (target) {
- var att = get.attitude(_status.event.player, target);
- var num = target.countCards("h");
- if (num > target.hp) return -att * (num - target.hp);
- return att * Math.max(0, Math.min(5, target.hp) - target.countCards("h"));
- });
- "step 1";
- if (result.bool) {
- var target = result.targets[0];
- player.line(target, "green");
- if (target.countCards("h") < target.hp) target.drawTo(Math.min(5, target.hp));
- else target.chooseToDiscard("h", true, target.countCards("h") - target.hp);
- }
- },
- },
- ciwei: {
- init: () => {
- game.addGlobalSkill("ciwei_ai");
- },
- onremove: () => {
- if (!game.hasPlayer(i => i.hasSkill("ciwei"), true)) game.removeGlobalSkill("ciwei_ai");
- },
- trigger: { global: "useCard" },
- direct: true,
- preHidden: true,
- filter: function (event, player) {
- if (event.all_excluded || event.player == player || event.player != _status.currentPhase || !player.countCards("he")) return false;
- return event.player.getHistory("useCard").indexOf(event) == 1 && ["basic", "trick"].includes(get.type(event.card));
- },
- content: function () {
- "step 0";
- if (player != game.me && !player.isOnline()) game.delayx();
- player
- .chooseToDiscard(get.prompt("ciwei", trigger.player), "弃置一张牌,取消" + get.translation(trigger.card) + "的所有目标", "he")
- .set("ai", function (card) {
- return _status.event.goon / 1.4 - get.value(card);
- })
- .set(
- "goon",
- (function () {
- if (!trigger.targets.length) return -get.attitude(player, trigger.player);
- var num = 0;
- for (var i of trigger.targets) {
- num -= get.effect(i, trigger.card, trigger.player, player);
- }
- return num;
- })()
- )
- .setHiddenSkill(event.name).logSkill = ["ciwei", trigger.player];
- "step 1";
- if (result.bool) {
- trigger.targets.length = 0;
- trigger.all_excluded = true;
- }
- },
- },
- ciwei_ai: {
- mod: {
- aiOrder: function (player, card, num) {
- if (
- player != _status.currentPhase ||
- player.getHistory("useCard").length > 1 ||
- !game.hasPlayer(function (current) {
- return current != player && (get.realAttitude || get.attitude)(current, player) < 0 && current.hasSkill("ciwei") && current.countCards("he") > 0;
- })
- )
- return;
- if (player.getHistory("useCard").length == 0) {
- if (["basic", "trick"].includes(get.type(card))) return num + 10;
- return;
- }
- if (!["basic", "trick"].includes(get.type(card))) return num + 10;
- if (!player._ciwei_temp) {
- player._ciwei_temp = true;
- num /= Math.max(1, player.getUseValue(card));
- }
- delete player._ciwei_temp;
- return num;
- },
- },
- trigger: { player: "dieAfter" },
- filter: () => {
- return !game.hasPlayer(i => i.hasSkill("ciwei"), true);
- },
- silent: true,
- forceDie: true,
- content: () => {
- game.removeGlobalSkill("ciwei_ai");
- },
- },
- caiyuan: {
- trigger: { player: "phaseEnd" },
- forced: true,
- preHidden: true,
- filter: function (event, player) {
- if (player.phaseNumber <= 1) return false;
- const history1 = _status.globalHistory,
- history2 = player.actionHistory;
- for (let i = 0; i < Math.min(history1.length, history2.length); i++) {
- let i1 = history1.length - 1 - i,
- i2 = history2.length - 1 - i;
- if (i > 0 && history2[i2].isMe) break;
- if (history1[i1].changeHp.some(evt => evt.player == player && evt.num < 0)) return false;
- }
- return true;
- },
- content: function () {
- player.draw(2);
- },
- },
- zhuosheng: {
- audio: 2,
- locked: false,
- init: function (player) {
- player.addSkill("zhuosheng_count");
- if (game.phaseNumber > 0) {
- var hs = player.getCards("h"),
- all = player.getAllHistory(),
- cards = [];
- for (var i = all.length - 1; i >= 0; i--) {
- for (var j of all[i].gain) {
- cards.addArray(j.cards);
- }
- if (all[i].isRound) break;
- }
- cards = cards.filter(function (i) {
- return hs.includes(i);
- });
- if (cards.length) player.addGaintag(cards, "zhuosheng");
- }
- },
- onremove: function (player) {
- player.removeSkill("zhuosheng_count");
- player.removeGaintag("zhuosheng");
- },
- mod: {
- targetInRange: function (card, player, target) {
- if (!card.cards || get.type(card) != "basic") return;
- for (var i of card.cards) {
- if (i.hasGaintag("zhuosheng")) return game.online ? player == _status.currentPhase : player.isPhaseUsing();
- }
- },
- cardUsable: function (card, player, target) {
- if (!card.cards || get.mode() == "guozhan" || get.type(card) != "basic" || !(game.online ? player == _status.currentPhase : player.isPhaseUsing())) return;
- for (var i of card.cards) {
- if (i.hasGaintag("zhuosheng")) return Infinity;
- }
- },
- aiOrder: function (player, card, num) {
- if (get.itemtype(card) == "card" && card.hasGaintag("zhuosheng") && get.type(card) == "basic") return num - 0.1;
- },
- },
- trigger: { player: "useCard2" },
- direct: true,
- filterx: function (event, player) {
- if (!player.isPhaseUsing()) return false;
- return (
- player.getHistory("lose", function (evt) {
- if (evt.getParent() != event) return false;
- for (var i in evt.gaintag_map) {
- if (evt.gaintag_map[i].includes("zhuosheng")) return true;
- }
- return false;
- }).length > 0
- );
- },
- filter: function (event, player) {
- if (!lib.skill.zhuosheng.filterx(event, player)) return false;
- if (get.type(event.card) != "trick") return false;
- if (event.targets && event.targets.length > 0) return true;
- var info = get.info(event.card);
- if (info.allowMultiple == false) return false;
- if (event.targets && !info.multitarget) {
- if (
- game.hasPlayer(function (current) {
- return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current);
- })
- ) {
- return true;
- }
- }
- return false;
- },
- content: function () {
- "step 0";
- var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标";
- player
- .chooseTarget(get.prompt("zhuosheng"), function (card, player, target) {
- var player = _status.event.player;
- if (_status.event.targets.includes(target)) return true;
- return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target);
- })
- .set("prompt2", prompt2)
- .set("ai", function (target) {
- var trigger = _status.event.getTrigger();
- var player = _status.event.player;
- return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1);
- })
- .set("targets", trigger.targets)
- .set("card", trigger.card);
- "step 1";
- if (result.bool) {
- if (!event.isMine() && !event.isOnline()) game.delayx();
- event.targets = result.targets;
- } else {
- event.finish();
- }
- "step 2";
- if (event.targets) {
- player.logSkill("zhuosheng", event.targets);
- if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets);
- else trigger.targets.addArray(event.targets);
- }
- },
- group: ["zhuosheng_equip", "zhuosheng_silent"],
- subfrequent: ["equip"],
- subSkill: {
- equip: {
- audio: "zhuosheng",
- trigger: { player: "useCard" },
- filter: function (event, player) {
- return get.type(event.card) == "equip" && lib.skill.zhuosheng.filterx(event, player);
- },
- frequent: true,
- prompt: "是否发动【擢升】摸一张牌?",
- content: function () {
- player.draw();
- },
- },
- silent: {
- trigger: {
- player: "useCard1",
- },
- silent: true,
- firstDo: true,
- filter: function (event, player) {
- return get.mode() != "guozhan" && get.type(event.card) == "basic" && lib.skill.zhuosheng.filterx(event, player) && event.addCount !== false;
- },
- content: function () {
- trigger.addCount = false;
- var stat = player.getStat();
- if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--;
- },
- },
- },
- },
- zhuosheng_count: {
- trigger: {
- player: "gainBegin",
- global: "roundStart",
- },
- silent: true,
- filter: function (event, player) {
- if (event.name == "gain") return event.getParent(2).name != "zhuosheng_equip";
- return game.roundNumber > 1;
- },
- content: function () {
- if (trigger.name == "gain") trigger.gaintag.add("zhuosheng");
- else player.removeGaintag("zhuosheng");
- },
- },
- xinquanbian: {
- audio: "quanbian",
- preHidden: true,
- trigger: { player: ["useCard", "respond"] },
- filter: function (event, player) {
- var phase = event.getParent("phaseUse");
- if (!phase || phase.player != player) return false;
- var suit = get.suit(event.card);
- if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false;
- return (
- player.getHistory("useCard", function (evt) {
- return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
- }).length +
- player.getHistory("respond", function (evt) {
- return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
- }).length ==
- 0
- );
- },
- content: function () {
- "step 0";
- var cards = get.cards(Math.min(5, player.maxHp));
- game.cardsGotoOrdering(cards);
- var suit = get.suit(trigger.card);
- var next = player.chooseToMove("权变:获得一张不为" + get.translation(suit) + "花色的牌并排列其他牌");
- next.set("suit", suit);
- next.set("list", [["牌堆顶", cards], ["获得"]]);
- next.set("filterMove", function (from, to, moved) {
- var suit = _status.event.suit;
- if (moved[0].includes(from.link)) {
- if (typeof to == "number") {
- if (to == 1) {
- if (moved[1].length) return false;
- return get.suit(from.link, false) != suit;
- }
- return true;
- }
- if (moved[1].includes(to.link)) return get.suit(from.link, false) != suit;
- return true;
- } else {
- if (typeof to == "number") return true;
- return get.suit(to.link, false) != suit;
- }
- });
- next.set("processAI", function (list) {
- var cards = list[0][1].slice(0).sort(function (a, b) {
- return get.value(b) - get.value(a);
- }),
- gains = [];
- for (var i of cards) {
- if (get.suit(i, false) != _status.event.suit) {
- cards.remove(i);
- gains.push(i);
- break;
- }
- }
- return [cards, gains];
- });
- "step 1";
- if (result.bool) {
- var list = result.moved;
- if (list[1].length) player.gain(list[1], "gain2");
- while (list[0].length) {
- ui.cardPile.insertBefore(list[0].pop(), ui.cardPile.firstChild);
- }
- game.updateRoundNumber();
- }
- },
- //group:'xinquanbian_count',
- init: (player, skill) => player.addSkill("xinquanbian_count"),
- onremove: (player, skill) => player.removeSkill("xinquanbian_count"),
- },
- xinquanbian_count: {
- trigger: {
- player: ["useCard0", "phaseUseBefore", "phaseUseAfter"],
- },
- silent: true,
- firstDo: true,
- charlotte: true,
- filter: function (event, player) {
- if (event.name === "phaseUse") return true;
- return player.isPhaseUsing() && lib.skill.quanbian.hasHand(event) && get.type(event.card) != "equip";
- },
- content: function () {
- var stat = player.getStat("skill");
- if (this.trigger.name === "phaseUse") {
- delete stat.xinquanbian;
- } else {
- if (!stat.xinquanbian) stat.xinquanbian = 0;
- stat.xinquanbian++;
- }
- },
- mod: {
- cardEnabled2: function (card, player) {
- var stat = player.getStat("skill");
- if (stat.xinquanbian && stat.xinquanbian >= player.maxHp && get.position(card) == "h" && get.type(card, player) != "equip") return false;
- },
- },
- },
- taoyin: {
- audio: 2,
- trigger: { player: "showCharacterAfter" },
- hiddenSkill: true,
- logTarget: function () {
- return _status.currentPhase;
- },
- filter: function (event, player) {
- var target = _status.currentPhase;
- return target && target != player && target.isAlive();
- },
- check: function (event, player) {
- return get.attitude(player, _status.currentPhase) < 0;
- },
- content: function () {
- _status.currentPhase.addTempSkill("taoyin2");
- _status.currentPhase.addMark("taoyin2", 2, false);
- },
- ai: {
- expose: 0.2,
- },
- },
- taoyin2: {
- onremove: true,
- charlotte: true,
- intro: {
- content: "手牌上限-#",
- },
- mod: {
- maxHandcard: function (player, num) {
- return num - player.countMark("taoyin2");
- },
- },
- },
- yimie: {
- audio: 2,
- usable: 1,
- preHidden: true,
- trigger: { source: "damageBegin1" },
- filter: function (event, player) {
- return player != event.player && event.num < event.player.hp;
- },
- check: function (event, player) {
- if (event.player.hasSkillTag("nodamage")) return false;
- let tj = player.countCards("hs", function (card) {
- return get.name(card) === "tao" || get.name(card) === "jiu";
- }),
- att = get.attitude(_status.event.player, event.player),
- eff = get.damageEffect(event.player, player, _status.event.player, get.natureList(event)),
- fd = event.player.hasSkillTag("filterDamage", null, {
- player: player,
- card: event.card,
- }),
- hp = player.hp + tj;
- if (player.storage.tairan2) hp -= player.storage.tairan2;
- if (eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false;
- if (hp > 2 || (eff > 0 && event.player.isLinked() && event.hasNature())) return true;
- return !event.player.countCards("hs") || (event.player.hp > 2 * event.num && !event.player.hasSkillTag("maixie"));
- },
- logTarget: "player",
- content: function () {
- player.loseHp();
- trigger.player.addTempSkill("yimie2");
- trigger.yimie_num = trigger.player.hp - trigger.num;
- trigger.num = trigger.player.hp;
- },
- ai: {
- damageBonus: true,
- skillTagFilter: function (player, tag, arg) {
- return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2;
- },
- },
- },
- yimie2: {
- trigger: { player: "damageEnd" },
- forced: true,
- popup: false,
- charlotte: true,
- filter: function (event, player) {
- return typeof event.yimie_num == "number";
- },
- content: function () {
- player.recover(trigger.yimie_num);
- },
- },
- ruilve: {
- unique: true,
- audio: 2,
- global: "ruilve2",
- zhuSkill: true,
- },
- ruilve2: {
- enable: "phaseUse",
- discard: false,
- lose: false,
- delay: false,
- line: true,
- log: false,
- prepare: function (cards, player, targets) {
- targets[0].logSkill("ruilve");
- },
- prompt: function () {
- var player = _status.event.player;
- var list = game.filterPlayer(function (target) {
- return target != player && target.hasZhuSkill("ruilve", player);
- });
- var str = "将一张具有伤害标签的基本牌或锦囊牌交给" + get.translation(list);
- if (list.length > 1) str += "中的一人";
- return str;
- },
- filter: function (event, player) {
- if (player.group != "jin") return false;
- if (player.countCards("h", lib.skill.ruilve2.filterCard) == 0) return false;
- return game.hasPlayer(function (target) {
- return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3");
- });
- },
- filterCard: function (card) {
- if (!get.tag(card, "damage")) return false;
- var type = get.type(card);
- return type == "basic" || type == "trick";
- },
- visible: true,
- filterTarget: function (card, player, target) {
- return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3");
- },
- content: function () {
- player.give(cards, target);
- target.addTempSkill("ruilve3", "phaseUseEnd");
- },
- ai: {
- expose: 0.3,
- order: 1,
- result: {
- target: 5,
- },
- },
- },
- ruilve3: {},
- tairan: {
- audio: 2,
- trigger: { player: "phaseEnd" },
- forced: true,
- preHidden: true,
- filter: function (event, player) {
- return player.hp < player.maxHp || player.countCards("h") < player.maxHp;
- },
- content: function () {
- "step 0";
- player.addSkill("tairan2");
- if (!player.storage.tairan2) player.storage.tairan2 = 0;
- var num = player.maxHp - player.hp;
- if (num > 0) {
- player.storage.tairan2 = num;
- player.recover(num);
- }
- "step 1";
- if (player.countCards("h") < player.maxHp) player.drawTo(Math.min(player.maxHp, 5 + player.countCards("h"))).gaintag = ["tairan"];
- },
- },
- tairan2: {
- mod: {
- aiOrder: function (player, card, num) {
- if (card.hasGaintag && card.hasGaintag("tairan")) return 10 * num;
- },
- aiValue: function (player, card, num) {
- if (card.hasGaintag && card.hasGaintag("tairan")) {
- if (card.name !== "wuxie" && (get.type(card) === "basic" || get.type(card, "trick") === "trick")) return num / 64;
- return num / 8;
- }
- },
- aiUseful: function (player, card, num) {
- return lib.skill.tairan2.mod.aiValue.apply(this, arguments);
- },
- },
- audio: "tairan",
- trigger: { player: "phaseUseBegin" },
- charlotte: true,
- forced: true,
- onremove: true,
- content: function () {
- var map = player.storage.tairan2;
- if (map > 0) player.loseHp(map);
- var hs = player.getCards("h", function (card) {
- return card.hasGaintag("tairan");
- });
- if (hs.length) player.discard(hs);
- player.removeSkill("tairan2");
- },
- },
- baoqie: {
- audio: 2,
- trigger: { player: "showCharacterAfter" },
- forced: true,
- hiddenSkill: true,
- filter: function (event, player) {
- return event.toShow && event.toShow.includes("jin_xiahouhui");
- },
- content: function () {
- "step 0";
- var card = get.cardPile(function (card) {
- return get.subtype(card, false) == "equip5" && !get.cardtag(card, "gifts");
- });
- if (!card) {
- event.finish();
- return;
- }
- event.card = card;
- player.gain(card, "gain2");
- "step 1";
- if (player.getCards("h").includes(card) && get.subtype(card) == "equip5") player.chooseUseTarget(card).nopopup = true;
- },
- },
- jyishi: {
- audio: 2,
- trigger: {
- global: ["loseAfter", "loseAsyncAfter"],
- },
- usable: 1,
- direct: true,
- preHidden: true,
- filter: function (event, player) {
- var target = _status.currentPhase;
- if (!target || !target.isIn() || event.type != "discard" || !target.isPhaseUsing()) return false;
- if (target == player) return false;
- var evt = event.getl(target);
- for (var i of evt.hs) {
- if (get.position(i, true) == "d") return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- event.target = _status.currentPhase;
- event.cards = trigger.getl(event.target).hs.filterInD("d");
- var str = "是否发动【宜室】令" + get.translation(event.target) + "获得一张牌";
- if (event.cards.length > 1) str += ",然后获得其余的牌";
- str += "?";
- player
- .chooseButton([str, event.cards])
- .set("ai", function (button) {
- var card = button.link;
- var source = _status.event.source;
- if (get.attitude(player, source) > 0) return Math.max(1, source.getUseValue(card, null, true));
- var cards = _status.event.getParent().cards.slice(0);
- if (cards.length == 1) return -get.value(card);
- cards.remove(card);
- return get.value(cards) - get.value(card) - 2;
- })
- .set("source", event.target)
- .setHiddenSkill(event.name);
- "step 1";
- if (result.bool) {
- player.logSkill("jyishi", target);
- if (cards.length > 1) {
- target.$gain2(result.links[0]);
- target.gain(result.links[0], "log");
- } else trigger.player.gain(result.links[0], "gain2");
- cards.remove(result.links[0]);
- if (cards.length) player.gain(cards, "gain2");
- } else player.storage.counttrigger.jyishi--;
- },
- },
- jyishi2: { charlotte: true },
- shiduo: {
- audio: 2,
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- return game.hasPlayer(function (target) {
- return player != target && player.canCompare(target);
- });
- },
- filterTarget: function (card, player, target) {
- return player != target && player.canCompare(target);
- },
- content: function () {
- "step 0";
- player.chooseToCompare(target);
- "step 1";
- if (result.bool && target.isAlive()) {
- var num = target.countCards("h");
- if (num > 0) player.gainPlayerCard(target, true, "h", num);
- } else event.finish();
- "step 2";
- var num = Math.floor(player.countCards("h") / 2);
- if (num && target.isAlive()) player.chooseCard("h", num, true, "交给" + get.translation(target) + get.cnNumber(num) + "张牌");
- else event.finish();
- "step 3";
- if (result.bool && result.cards && result.cards.length) player.give(result.cards, target);
- },
- ai: {
- order: 1,
- result: {
- target: function (player, target) {
- var delta = target.countCards("h") - player.countCards("h");
- if (delta < 0) return 0;
- return -1 - delta;
- },
- },
- },
- },
- tuishi: {
- audio: 2,
- trigger: { player: "showCharacterAfter" },
- forced: true,
- locked: false,
- hiddenSkill: true,
- filter: function (event, player) {
- var target = _status.currentPhase;
- return player != target && target && target.isAlive() && event.toShow && event.toShow.includes("jin_simazhao");
- },
- content: function () {
- player.addTempSkill("tuishi2");
- },
- },
- tuishi2: {
- trigger: { global: "phaseEnd" },
- direct: true,
- charlotte: true,
- filter: function (event, player) {
- var target = _status.currentPhase;
- return (
- target != player &&
- target &&
- target.isAlive() &&
- game.hasPlayer(function (current) {
- return current != target && target.inRange(current);
- })
- );
- },
- content: function () {
- "step 0";
- var target = _status.currentPhase;
- event.target = target;
- player
- .chooseTarget(get.prompt2("tuishi", event.target), function (card, player, target) {
- var source = _status.event.source;
- return source != target && source.inRange(target);
- })
- .set("source", target)
- .set("goon", get.damageEffect(target, player, player) > 0)
- .set("ai", function (target) {
- if (!_status.event.goon) return 0;
- var evt = _status.event;
- return get.effect(target, { name: "sha" }, evt.source, evt.player);
- });
- "step 1";
- if (result.bool) {
- event.target2 = result.targets[0];
- player.logSkill("tuishi");
- player.line2([target, event.target2]);
- game.delayx();
- } else event.finish();
- "step 2";
- target.chooseToUse({
- preTarget: event.target2,
- prompt: "请对" + get.translation(event.target2) + "使用一张【杀】,或受到来自" + get.translation(player) + "的1点伤害",
- filterCard: function (card, player) {
- return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments);
- },
- filterTarget: function (card, player, target) {
- return target == _status.event.preTarget && lib.filter.filterTarget.apply(this, arguments);
- },
- addCount: false,
- });
- "step 3";
- if (!result.bool) target.damage();
- },
- },
- xinchoufa: {
- audio: "choufa",
- inherit: "choufa",
- content: function () {
- "step 0";
- player.choosePlayerCard(target, "h", true);
- "step 1";
- player.showCards(result.cards, get.translation(player) + "对" + get.translation(target) + "发动了【筹伐】");
- var type = get.type2(result.cards[0], target),
- hs = target.getCards("h", function (card) {
- return card != result.cards[0] && get.type2(card, target) != type;
- });
- if (hs.length) {
- target.addGaintag(hs, "xinchoufa");
- target.addTempSkill("xinchoufa2", { player: "phaseAfter" });
- }
- },
- },
- xinchoufa2: {
- charlotte: true,
- onremove: function (player) {
- player.removeGaintag("xinchoufa");
- },
- mod: {
- cardname: function (card) {
- if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return "sha";
- },
- cardnature: function (card) {
- if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return false;
- },
- },
- },
- choufa: {
- enable: "phaseUse",
- audio: 2,
- usable: 1,
- filter: function (event, player) {
- return game.hasPlayer(function (current) {
- return lib.skill.choufa.filterTarget(null, player, current);
- });
- },
- filterTarget: function (card, player, target) {
- return target != player && !target.hasSkill("choufa2") && target.countCards("h") > 0;
- },
- content: function () {
- "step 0";
- player.choosePlayerCard(target, "h", true);
- "step 1";
- player.showCards(result.cards);
- var type = get.type2(result.cards[0], target);
- target.storage.choufa2 = type;
- target.addTempSkill("choufa2", { player: "phaseAfter" });
- },
- ai: {
- order: 9,
- result: {
- target: function (player, target) {
- return -target.countCards("h");
- },
- },
- },
- },
- choufa2: {
- onremove: true,
- charlotte: true,
- mark: true,
- intro: { content: "手牌中的非$牌均视为杀" },
- mod: {
- cardname: function (card, player) {
- if (get.type2(card, false) != player.storage.choufa2) return "sha";
- },
- cardnature: function (card, player) {
- if (get.type2(card, false) != player.storage.choufa2) return false;
- },
- },
- },
- zhaoran: {
- audio: 2,
- trigger: { player: "phaseUseBegin" },
- preHidden: true,
- content: function () {
- player.addTempSkill("zhaoran2", "phaseUseAfter");
- var cards = player.getCards("h");
- if (cards.length > 0) player.addShownCards(cards, "visible_zhaoran");
- },
- },
- zhaoran2: {
- audio: "zhaoran",
- group: "zhaoran3",
- init: (player, skill) => {
- if (!player.storage[skill]) player.storage[skill] = [];
- },
- onremove: true,
- trigger: {
- player: "loseAfter",
- global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
- },
- forced: true,
- charlotte: true,
- popup: false,
- filter: function (event, player, name) {
- if (name == "gainBegin") return true;
- var evt = event.getl(player);
- if (!evt || !evt.hs || !evt.hs.length) return false;
- var list = player.getStorage("zhaoran2");
- for (var i of evt.hs) {
- var suit = get.suit(i, player);
- if (!list.includes(suit) && !player.countCards("h", { suit: suit })) return true;
- }
- return false;
- },
- content: function () {
- "step 0";
- if (trigger.delay === false) game.delayx();
- "step 1";
- var list = [];
- var suits = get.copy(player.storage.zhaoran2);
- suits.addArray(
- player.getCards("h").map(function (card) {
- return get.suit(card);
- })
- );
- var evt = trigger.getl(player);
- for (var i of evt.hs) {
- var suit = get.suit(i, player);
- if (!suits.includes(suit)) list.add(suit);
- }
- event.count = list.length;
- player.markAuto("zhaoran2", list);
- "step 1";
- event.count--;
- var filterTarget = function (card, player, target) {
- return target != player && target.countDiscardableCards(player, "he") > 0;
- };
- if (
- !game.hasPlayer(function (current) {
- return filterTarget(null, player, current);
- })
- )
- event._result = { bool: false };
- else
- player.chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌").set("ai", function (target) {
- var att = get.attitude(player, target);
- if (att >= 0) return 0;
- if (
- target.countCards("he", function (card) {
- return get.value(card) > 5;
- })
- )
- return -att;
- return 0;
- });
- "step 2";
- if (!result.bool) {
- player.logSkill("zhaoran2");
- player.draw();
- } else {
- var target = result.targets[0];
- player.logSkill("zhaoran2", target);
- player.discardPlayerCard(target, true, "he");
- }
- if (event.count > 0) event.goto(1);
- },
- intro: {
- content: "已因$牌触发过效果",
- },
- },
- zhaoran3: {
- trigger: { player: ["phaseUseEnd", "gainBegin"] },
- forced: true,
- charlotte: true,
- firstDo: true,
- silent: true,
- content: function () {
- if (event.triggername == "gainBegin") {
- trigger.gaintag.add("visible_zhaoran");
- } else {
- player.hideShownCards(player.getCards("h"), "visible_zhaoran");
- }
- },
- },
- chengwu: {
- zhuSkill: true,
- mod: {
- inRange: function (from, to) {
- if (!from.hasZhuSkill("chengwu") || from._chengwu) return;
- from._chengwu = true;
- var bool = game.hasPlayer(function (current) {
- return current != from && current != to && current.group == "jin" && from.hasZhuSkill("chengwu", current) && current.inRange(to);
- });
- delete from._chengwu;
- if (bool) return true;
- },
- },
- },
- shiren: {
- trigger: { player: "showCharacterAfter" },
- hiddenSkill: true,
- logTarget: function () {
- return _status.currentPhase;
- },
- filter: function (event, player) {
- if (!event.toShow || !event.toShow.includes("jin_wangyuanji")) return false;
- var target = _status.currentPhase;
- return target && target != player && target.isAlive() && target.countCards("h") > 0;
- },
- content: function () {
- var next = game.createEvent("yanxi", false);
- next.player = player;
- next.target = _status.currentPhase;
- next.setContent(lib.skill.yanxi.content);
- },
- },
- yanxi: {
- enable: "phaseUse",
- usable: 1,
- filterTarget: function (card, player, target) {
- return target != player && target.countCards("h") > 0;
- },
- filter: function (event, player) {
- return game.hasPlayer(function (current) {
- return current != player && current.countCards("h") > 0;
- });
- },
- content: function () {
- "step 0";
- event.card = target.getCards("h").randomGet();
- var cards;
- cards = get.cards(2);
- event.cards = cards.concat([event.card]);
- while (cards.length) {
- ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild);
- }
- if (get.mode() == "guozhan") {
- var num = ui.cardPile.childElementCount;
- var num1 = get.rand(1, num - 1),
- num2 = get.rand(1, num - 1);
- if (num1 == num2) {
- if (num1 == 0) num2++;
- else num1--;
- }
- event.cards = [event.card, ui.cardPile.childNodes[num1], ui.cardPile.childNodes[num2]];
- }
- game.updateRoundNumber();
- event.cards.randomSort();
- game.log(player, "展示了", event.cards);
- event.videoId = lib.status.videoId++;
- var str = get.translation(player) + "对" + get.translation(target) + "发动了【宴戏】";
- game.broadcastAll(
- function (str, id, cards) {
- var dialog = ui.create.dialog(str, cards);
- dialog.videoId = id;
- },
- str,
- event.videoId,
- event.cards
- );
- game.addVideo("showCards", player, [str, get.cardsInfo(event.cards)]);
- game.delay(2);
- "step 1";
- var func = function (id, target) {
- var dialog = get.idDialog(id);
- if (dialog) dialog.content.firstChild.innerHTML = "猜猜哪张是" + get.translation(target) + "的手牌?";
- };
- if (player == game.me) func(event.videoId, target);
- else if (player.isOnline()) player.send(func, event.videoId, target);
- "step 2";
- var next = player.chooseButton(true);
- next.set("dialog", event.videoId);
- next.set("ai", function (button) {
- if (_status.event.answer) return button.link == _status.event.answer ? 1 : 0;
- return get.value(button.link, _status.event.player);
- });
- if (player.hasSkillTag("viewHandcard", null, target, true)) next.set("answer", card);
- "step 3";
- game.broadcastAll("closeDialog", event.videoId);
- player.addTempSkill("yanxi2");
- var card2 = result.links[0];
- if (card2 == card) {
- player.popup("洗具");
- cards.remove(card2);
- player.$gain2(cards);
- player.gain(cards, "log").gaintag.add("yanxi");
- player.gain(card, target, "bySelf", "give").gaintag.add("yanxi");
- } else {
- player.popup("杯具");
- player.gain(card2, "gain2").gaintag.add("yanxi");
- }
- },
- ai: {
- order: 6,
- result: {
- player: 1,
- target: -0.6,
- },
- },
- },
- yanxi2: {
- mod: {
- ignoredHandcard: function (card, player) {
- if (card.hasGaintag("yanxi")) return true;
- },
- cardDiscardable: function (card, player, name) {
- if (name == "phaseDiscard" && card.hasGaintag("yanxi")) return false;
- },
- },
- onremove: function (player) {
- player.removeGaintag("yanxi");
- },
- },
- sanchen: {
- enable: "phaseUse",
- usable: 1,
- filter: function (event, player) {
- var stat = player.getStat("sanchen");
- return game.hasPlayer(function (current) {
- return !stat || !stat.includes(current);
- });
- },
- filterTarget: function (card, player, target) {
- var stat = player.getStat("sanchen");
- return !stat || !stat.includes(target);
- },
- content: function () {
- "step 0";
- var stat = player.getStat();
- if (!stat.sanchen) stat.sanchen = [];
- stat.sanchen.push(target);
- if (get.mode() != "guozhan") player.addMark("sanchen", 1, false);
- target.draw(3);
- "step 1";
- if (!target.countCards("he")) event._result = { bool: false };
- else
- target.chooseToDiscard("he", true, 3).set("ai", function (card) {
- var list = ui.selected.cards.map(function (i) {
- return get.type2(i);
- });
- if (!list.includes(get.type2(card))) return 7 - get.value(card);
- return -get.value(card);
- });
- "step 2";
- if (result.bool && result.cards && result.cards.length) {
- var list = [];
- for (var i of result.cards) list.add(get.type2(i));
- if (list.length == result.cards.length) {
- target.draw();
- player.getStat("skill").sanchen--;
- if (get.mode() == "guozhan") player.addTempSkills("pozhu");
- }
- } else {
- target.draw();
- player.getStat("skill").sanchen--;
- if (get.mode() == "guozhan") player.addTempSkills("pozhu");
- }
- },
- ai: {
- order: 9,
- threaten: 1.7,
- result: {
- target: function (player, target) {
- if (target.hasSkillTag("nogain")) return 0.1;
- return Math.sqrt(target.countCards("he"));
- },
- },
- },
- intro: {
- content: "已发动过#次技能",
- },
- marktext: "陈",
- },
- zhaotao: {
- forbid: ["guozhan"],
- trigger: { player: "phaseZhunbeiBegin" },
- forced: true,
- juexingji: true,
- skillAnimation: true,
- animationColor: "thunder",
- filter: function (event, player) {
- return player.countMark("sanchen") > 2;
- },
- content: function () {
- player.awakenSkill("zhaotao");
- player.loseMaxHp();
- player.addSkills("pozhu");
- },
- derivation: "pozhu",
- ai: {
- combo: "sanchen",
- },
- },
- pozhu: {
- enable: "phaseUse",
- viewAsFilter: function (player) {
- return !player.hasSkill("pozhu3", null, null, false) && player.countCards("hs") > 0;
- },
- viewAs: { name: "chuqibuyi" },
- filterCard: true,
- position: "hs",
- check: function (card) {
- return 7 - get.value(card);
- },
- group: "pozhu2",
- },
- pozhu2: {
- trigger: { player: "useCardAfter" },
- silent: true,
- filter: function (event, player) {
- return (
- event.skill == "pozhu" &&
- (get.mode() == "guozhan" ||
- !player.getHistory("sourceDamage", function (evt) {
- return evt.card == event.card;
- }).length)
- );
- },
- content: function () {
- player.addTempSkill("pozhu3");
- },
- },
- pozhu3: { charlotte: true },
- xijue: {
- audio: 2,
- trigger: {
- global: "phaseBefore",
- player: ["enterGame", "showCharacterAfter"],
- },
- forced: true,
- filter: function (event, player) {
- if (player._xijue) return false;
- if (get.mode() == "guozhan") return event.name == "showCharacter" && event.toShow && event.toShow.includes("gz_zhanghuyuechen");
- return event.name != "showCharacter" && (event.name != "phase" || game.phaseNumber == 0);
- },
- content: function () {
- player.addMark("xijue", 4);
- player._xijue = true;
- },
- intro: {
- name2: "爵",
- content: "mark",
- },
- derivation: ["xijue_tuxi", "xijue_xiaoguo"],
- group: ["xijue_gain", "xijue_tuxi", "xijue_xiaoguo"],
- },
- xijue_gain: {
- audio: "xijue",
- trigger: { player: "phaseEnd" },
- forced: true,
- filter: function (event, player) {
- var stat = player.getStat();
- return stat.damage && stat.damage > 0;
- },
- content: function () {
- player.addMark("xijue", player.getStat().damage);
- },
- },
- xijue_tuxi: {
- audio: 2,
- trigger: {
- player: "phaseDrawBegin2",
- },
- direct: true,
- filter: function (event, player) {
- return (
- event.num > 0 &&
- !event.numFixed &&
- player.hasMark("xijue") &&
- game.hasPlayer(function (target) {
- return player != target && target.countCards("h") > 0;
- })
- );
- },
- content: function () {
- "step 0";
- var num = trigger.num;
- if (get.mode() == "guozhan" && num > 2) num = 2;
- player.chooseTarget(
- "是否弃置一枚“爵”发动【突袭】?",
- "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌",
- [1, num],
- function (card, player, target) {
- return target.countCards("h") > 0 && player != target;
- },
- function (target) {
- var att = get.attitude(_status.event.player, target);
- if (target.hasSkill("tuntian")) return att / 10;
- return 1 - att;
- }
- );
- "step 1";
- if (result.bool) {
- result.targets.sortBySeat();
- player.logSkill("xijue_tuxi", result.targets);
- player.removeMark("xijue", 1);
- player.gainMultiple(result.targets);
- trigger.num -= result.targets.length;
- } else {
- event.finish();
- }
- "step 2";
- if (trigger.num <= 0) game.delay();
- },
- ai: {
- expose: 0.2,
- },
- },
- xijue_xiaoguo: {
- audio: 2,
- trigger: { global: "phaseJieshuBegin" },
- filter: function (event, player) {
- return (
- player.hasMark("xijue") &&
- event.player.isAlive() &&
- event.player != player &&
- player.countCards("h", function (card) {
- if (_status.connectMode || get.mode() != "guozhan") return true;
- return get.type(card) == "basic";
- })
- );
- },
- direct: true,
- content: function () {
- "step 0";
- var nono =
- Math.abs(get.attitude(player, trigger.player)) < 3 ||
- trigger.player.hp > player.countMark("xijue") * 1.5 ||
- trigger.player.countCards("e", function (card) {
- return get.value(card, trigger.player) <= 0;
- });
- if (get.damageEffect(trigger.player, player, player) <= 0) {
- nono = true;
- }
- var next = player.chooseToDiscard(`是否弃置一枚“爵”和一张${get.mode() == "guozhan" ? "基本" : "手"}牌,对${get.translation(trigger.player)}发动【骁果】?`, "h", function (card, player) {
- if (get.mode() != "guozhan") return true;
- return get.type(card, player) == "basic";
- });
- next.set("ai", function (card) {
- if (_status.event.nono) return 0;
- return 8 - get.useful(card);
- });
- next.set("logSkill", ["xijue_xiaoguo", trigger.player]);
- next.set("nono", nono);
- "step 1";
- if (result.bool) {
- player.removeMark("xijue", 1);
- var nono = get.damageEffect(trigger.player, player, trigger.player) >= 0;
- trigger.player
- .chooseToDiscard("he", "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", { type: "equip" })
- .set("ai", function (card) {
- if (_status.event.nono) {
- return 0;
- }
- if (_status.event.player.hp == 1) return 10 - get.value(card);
- return 9 - get.value(card);
- })
- .set("nono", nono);
- } else {
- event.finish();
- }
- "step 2";
- if (result.bool) {
- if (get.mode() != "guozhan") player.draw();
- } else {
- trigger.player.damage();
- }
- },
- ai: {
- expose: 0.3,
- threaten: 1.3,
- },
- },
- huishi: {
- audio: 2,
- trigger: { player: "phaseDrawBegin1" },
- filter: function (event, player) {
- return ui.cardPile.childElementCount % 10 > 0 && !event.numFixed;
- },
- preHidden: true,
- prompt: function () {
- return get.prompt("huishi") + "(当前牌堆尾数:" + (ui.cardPile.childElementCount % 10) + ")";
- },
- check: function (event, player) {
- return ui.cardPile.childElementCount % 10 > 3;
- },
- content: function () {
- "step 0";
- trigger.changeToZero();
- var cards = game.cardsGotoOrdering(get.cards(ui.cardPile.childElementCount % 10)).cards;
- var num = Math.ceil(cards.length / 2);
- var next = player.chooseToMove("慧识:将" + get.cnNumber(num) + "张牌置于牌堆底并获得其余的牌", true);
- next.set("list", [["牌堆顶的展示牌", cards], ["牌堆底"]]);
- next.set("filterMove", function (from, to, moved) {
- if (moved[0].includes(from) && to == 1) return moved[1].length < _status.event.num;
- return true;
- });
- next.set("filterOk", function (moved) {
- return moved[1].length == _status.event.num;
- });
- next.set("num", num);
- next.set("processAI", function (list) {
- var cards = list[0][1].slice(0).sort(function (a, b) {
- return get.value(b) - get.useful(a);
- });
- return [cards, cards.splice(cards.length - _status.event.num)];
- });
- "step 1";
- if (result.bool) {
- var list = result.moved;
- if (list[0].length) player.gain(list[0], "gain2");
- while (list[1].length) ui.cardPile.appendChild(list[1].shift().fix());
- }
- },
- },
- qingleng: {
- audio: 2,
- trigger: { global: "phaseEnd" },
- direct: true,
- preHidden: true,
- filter: function (event, player) {
- var target = event.player;
- return target != player && target.isIn() && !target.storage.nohp && target.hp + target.countCards("h") >= ui.cardPile.childElementCount % 10 && player.countCards("he") > 0 && player.canUse({ name: "sha", nature: "ice" }, target, false);
- },
- content: function () {
- "step 0";
- player
- .chooseCard("he", get.prompt("qingleng", trigger.player), "将一张牌当做冰【杀】对其使用", function (card, player) {
- return player.canUse(get.autoViewAs({ name: "sha", nature: "ice" }, [card]), _status.event.target, false);
- })
- .set("target", trigger.player)
- .set("ai", function (card) {
- if (get.effect(_status.event.target, get.autoViewAs({ name: "sha", nature: "ice" }, [card]), player) <= 0) return false;
- return 6 - get.value(card);
- })
- .setHiddenSkill(event.name);
- "step 1";
- if (result.bool) {
- player.useCard(get.autoViewAs({ name: "sha", nature: "ice" }, result.cards), result.cards, false, trigger.player, "qingleng");
- if (!player.storage.qingleng || !player.storage.qingleng.includes(trigger.player)) {
- player.draw();
- player.markAuto("qingleng", [trigger.player]);
- player.storage.qingleng.sortBySeat();
- }
- }
- },
- intro: {
- content: "已对$发动过此技能",
- },
- },
- xuanmu: {
- audio: 2,
- trigger: { player: "showCharacterAfter" },
- forced: true,
- hiddenSkill: true,
- filter: function (event, player) {
- return event.toShow.includes("jin_zhangchunhua") && player != _status.currentPhase;
- },
- content: function () {
- player.addTempSkill("xuanmu2");
- },
- },
- xuanmu2: {
- trigger: { player: "damageBegin4" },
- forced: true,
- popup: false,
- content: function () {
- trigger.cancel();
- },
- ai: {
- effect: {
- target: function (card, player, target) {
- if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return "zerotarget";
- },
- },
- },
- },
- g_hidden_ai: {
- charlotte: true,
- ai: {
- threaten: function (player, target) {
- if (get.mode() != "guozhan" && target.isUnseen(2)) return 0.0001;
- return 1;
- },
- },
- },
- },
- card: {
- cheliji_sichengliangyu: {
- fullskin: true,
- vanish: true,
- derivation: "cheliji",
- destroy: "chexuan",
- type: "equip",
- subtype: "equip5",
- skills: ["cheliji_sichengliangyu"],
- },
- cheliji_tiejixuanyu: {
- fullskin: true,
- vanish: true,
- derivation: "cheliji",
- destroy: "chexuan",
- type: "equip",
- subtype: "equip5",
- skills: ["cheliji_tiejixuanyu"],
- },
- cheliji_feilunzhanyu: {
- fullskin: true,
- vanish: true,
- derivation: "cheliji",
- destroy: "chexuan",
- type: "equip",
- subtype: "equip5",
- skills: ["cheliji_feilunzhanyu"],
- },
- },
- characterIntro: {
- zhanghuyuechen: "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。三国时期曹魏将领。名将张辽之子。官至偏将军,袭封晋阳侯,有一子张统。乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。",
- duyu: "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。",
- xiahouhui: "夏侯徽(211年-234年),字媛容,沛国谯县(今安徽亳州)人,司马师第一任妻子。征南大将军夏侯尚之女,母德阳乡主为大司马曹真之妹。夏侯徽与司马师之间,生有五个女儿。夏侯徽很有见识器度,每当司马师有什么想法时,都由她从旁策划协助。当时司马师之父司马懿位居上将重位,而他的儿子们都有雄才大略。夏侯徽深知司马师绝非曹魏忠臣,而司马师对出身曹魏家族的夏侯徽也非常顾忌。青龙二年(234年),正逢“大疫”、“大病”之年,夏侯徽被司马师毒杀,时年二十四岁,死后葬于峻平陵。西晋建国后,追谥夏侯徽为景怀皇后。",
- shibao: "石苞(?~273年),字仲容,渤海南皮(今河北省南皮县)人。三国时曹魏至西晋重要将领,西晋开国功臣。西晋建立后,历任大司马、侍中、司徒等职,封乐陵郡公,卒后谥号为“武”。",
- simazhou: "司马伷(227年~283年6月12日),字子将,河内郡温县(今河南省温县)人。西晋宗室、将领,晋宣帝司马懿第三子,伏太妃所生。晋景帝司马师、文帝司马昭的同父异母弟,晋武帝司马炎的叔父。司马伷少有才气,在曹魏历任宁朔将军、散骑常侍、征虏将军等职,先后受封南安亭侯、东武乡侯,五等爵制建立后,改封南皮伯。西晋建立后,获封东莞郡王,入朝任尚书右仆射、抚军将军,出外拜镇东大将军。后改封琅邪王,加开府仪同三司。西晋伐吴时,率军出涂中,孙皓向他投降并奉上玉玺。战后因功拜大将军,增邑三千户。太康四年(283年),司马伷去世,享年五十七岁。谥号为武,世称“琅邪武王”。著有《周官宁朔新书》八卷,今已亡佚。",
- huangzu: "黄祖(?-208年),东汉末年将领。刘表任荆州牧时,黄祖出任江夏太守。初平二年(191年),黄祖在与长沙太守孙坚交战时,其部下将孙坚射死,因此与孙家结下仇怨。之后,黄祖多次率部与东吴军队交战,射杀凌操、徐琨等人。建安十三年(208年),在与孙权的交战中,兵败被杀。",
- cheliji: "彻里吉是历史小说《三国演义》中的虚构人物,西羌国王。蜀相诸葛亮伐魏,魏都督曹真驰书赴羌,国王彻里吉即命雅丹丞相与越吉元帅起羌兵一十五万、并战车直扣西平关。后军大败,越吉亡,雅丹被俘,亮将所获羌兵及车马器械,尽给还雅丹,俱放回国。彻里吉感蜀恩义,与之结盟。正史中没有关于彻里吉的记载。",
- weiguan: "卫瓘(220年-291年),字伯玉。河东郡安邑县(今山西省夏县)人。三国曹魏后期至西晋初年重臣、书法家,曹魏尚书卫觊之子。卫瓘出身官宦世家,年轻时仕官于曹魏,历任尚书郎、散骑常侍、侍中、廷尉等职。后以镇西军司、监军身份参与伐蜀战争。蜀汉亡后,与钟会一道逮捕邓艾;钟会谋反时,又成功平息叛乱,命田续杀邓艾父子。回师后转任督徐州诸军事、镇东将军,封菑阳侯。西晋建立后,历任青州、幽州刺史、征东大将军等职,成功化解北方边境威胁,因功进爵菑阳公。后入朝为尚书令、侍中,又升任司空,领太子少傅。后逊位,拜太保。晋惠帝即位后,与贾皇后对立,终在政变中满门遇害,享年七十二岁。卫瓘善隶书及章草。不仅兼工各体,还能学古人之长,是颇有创意的书法家。唐朝张怀瓘《书断》中评其章草为“神品”。",
- zhongyan: " 钟琰 (?—?年)颍川人,王浑之妻。生卒年不详,约魏末晋初间前后在世。王浑的妻子钟琰,是颍川人,为魏太傅钟繇的曾孙女,父亲钟徽,为黄门郎。她平时广泛阅读各种书籍,因此几岁的时候就能撰写文章。她聪慧弘雅,善于啸咏,她的礼仪法度,为中表所推崇,她写有文集五卷。",
- yangyan: "杨艳(238年-274年8月25日),字琼芝,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第一任皇后,曹魏通事郎杨炳之女。自幼父母双亡,为舅舅赵俊所养,跟随继母段氏生活。聪明贤慧,善于书法,天生丽质,娴熟女红,嫁给了世子司马炎。泰始元年(265年),晋武帝即位,建立西晋。泰始二年(266年),杨艳受册为皇后,深得晋武帝宠幸,生下三子三女,包括晋惠帝司马衷。泰始十年(274年),去世,时年三十七,陪葬于峻阳陵,谥号武元皇后。",
- yangzhi: "杨芷(259年-292年3月6日),字季兰,小字男胤,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第二任皇后,东汉太尉杨震幼子杨奉后裔,东汉末年东莱太守、蓩亭侯杨众曾孙女,西晋太傅杨骏与嫡妻庞氏之女,武元皇后杨艳堂妹。咸宁二年(276年),立为皇后,史称“婉嫕有妇德, 美映椒房”,得宠于晋武帝。生渤海殇王,早薨,之后再无生育。其父杨骏擅权引起皇后贾南风忌恨,贾南风联络汝南王司马亮、楚王司马玮发动政变,杀死杨骏,并唆使大臣上书状告杨芷谋反,让晋惠帝司马衷将其贬为庶人,押到金墉城居住。元康二年(292年),杨芷冻饿而死,谥号武悼皇后。",
- xinchang: "辛敞(生卒年不详),字泰雍,陇西人氏,是曹魏时代官员。卫尉辛毗之子,辛宪英之弟。",
- xuangongzhu: "高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。",
- jin_guohuai: "郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。",
- wangxiang: "王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。",
- chengjichengcui: "成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。",
- },
- characterTitle: {},
- characterFilter: {},
- dynamicTranslate: {},
- perfectPair: {
- jin_simayi: ["jin_zhangchunhua", "shibao", "duyu"],
- jin_simazhao: ["jin_wangyuanji"],
- jin_simashi: ["jin_xiahouhui", "jin_yanghuiyu"],
- xuangongzhu: ["duyu"],
- },
- characterReplace: {
- yanghu: ["jin_yanghu", "dc_yanghu", "sp_yanghu"],
- jiachong: ["dc_jiachong", "jin_jiachong", "jiachong"],
- yangyan: ["yangyan", "old_yangyan"],
- yangzhi: ["yangzhi", "old_yangzhi"],
- zhongyan: ["zhongyan", "clan_zhongyan"],
- },
- translate: {
- jin_zhangchunhua: "晋张春华",
- jin_zhangchunhua_prefix: "晋",
- huishi: "慧识",
- huishi_info: "摸牌阶段,你可以放弃摸牌,改为观看牌堆顶的X张牌,获得其中的一半(向下取整),然后将其余牌置入牌堆底。(X为牌堆数量的个位数)",
- qingleng: "清冷",
- qingleng_info: "一名角色的回合结束时,若其体力值与手牌数之和不小于X,则你可将一张牌当无距离限制的冰属性【杀】对其使用(X为牌堆数量的个位数)。若这是你本局游戏内首次对其发动此技能,则你摸一张牌。",
- xuanmu: "宣穆",
- xuanmu2: "宣穆",
- xuanmu_info: "锁定技,隐匿技。你于其他角色的回合登场时,防止你受到的伤害直到回合结束。",
- jin_simayi: "晋司马懿",
- jin_simayi_prefix: "晋",
- zhanghuyuechen: "张虎乐綝",
- xijue: "袭爵",
- xijue_gain: "袭爵",
- xijue_info: "锁定技,游戏开始时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。",
- xijue_info_guozhan: "锁定技,当你首次明置此武将牌时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。",
- xijue_tuxi: "突袭",
- xijue_tuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。",
- xijue_tuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。",
- xijue_xiaoguo: "骁果",
- xijue_xiaoguo_info: "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。",
- xijue_xiaoguo_info_guozhan: "其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。",
- gz_duyu: "杜预",
- duyu: "晋杜预",
- duyu_prefix: "晋",
- sanchen: "三陈",
- sanchen_info: "出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。",
- sanchen_info_guozhan: "出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。",
- zhaotao: "诏讨",
- zhaotao_info: "觉醒技,准备阶段,若你本局游戏内发动〖三陈〗的次数大于2,则你减1点体力上限并获得〖破竹〗。",
- pozhu: "破竹",
- pozhu_info: "出牌阶段,你可以将一张手牌当做【出其不意】使用。若你未因此牌造成过伤害,则你不能再发动〖破竹〗直到回合结束。",
- pozhu_info_guozhan: "出牌阶段限一次,你可以将一张手牌当做【出其不意】使用。",
- jin_wangyuanji: "晋王元姬",
- jin_wangyuanji_prefix: "晋",
- shiren: "识人",
- shiren_info: "隐匿技。你于其他角色的回合内登场时,若其有手牌,则你可对其发动〖宴戏〗。",
- yanxi: "宴戏",
- yanxi2: "宴戏",
- yanxi_info: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆顶的两张牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。",
- yanxi_info_guozhan: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆中的两张随机牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。",
- jin_simazhao: "晋司马昭",
- jin_simazhao_prefix: "晋",
- tuishi: "推弑",
- tuishi_info: "隐匿技,你于其他角色A的回合内登场时,可于此回合结束时选择其攻击范围内的一名角色B。A选择一项:①对B使用一张【杀】。②你对A造成1点伤害。",
- choufa: "筹伐",
- choufa2: "筹伐",
- choufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌并记录其类型A。你令其原类型不为A的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。",
- xinchoufa: "筹伐",
- xinchoufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌A。你令其所有类型与A不同的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。",
- zhaoran: "昭然",
- zhaoran2: "昭然",
- zhaoran_info: "出牌阶段开始时,你可令你的手牌对其他角色可见直到出牌阶段结束。若如此做,当你于此阶段内失去一张手牌后,若你的手牌里没有与此牌花色相同的牌且你本回合内未因该花色的牌触发过此效果,则你选择一项:①摸一张牌。②弃置一名其他角色的一张牌。",
- visible_zhaoran: "invisible",
- chengwu: "成务",
- chengwu_info: "主公技,锁定技,其他晋势力角色攻击范围内的角色视为在你的攻击范围内。",
- jin_xiahouhui: "晋夏侯徽",
- jin_xiahouhui_prefix: "晋",
- baoqie: "宝箧",
- baoqie_info: "隐匿技,锁定技。你登场后,从牌堆或弃牌堆中获得一张不为赠物的宝物牌。若此牌在你的手牌区内为宝物牌,则你可以使用此牌。",
- jyishi: "宜室",
- jyishi_info: "每回合限一次,当有其他角色于其出牌阶段内因弃置而失去手牌后,你可令其获得这些牌中位于弃牌堆的一张,然后你获得其余位于弃牌堆的牌。",
- shiduo: "识度",
- shiduo_info: "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得其所有手牌。然后你交给其X张手牌(X为你手牌数的一半,向下取整)。",
- jin_simashi: "晋司马师",
- jin_simashi_prefix: "晋",
- taoyin: "韬隐",
- taoyin2: "韬隐",
- taoyin_info: "隐匿技,当你登场后,若当前回合角色存在且不是你,则你可令该角色本回合的手牌上限-2。",
- yimie: "夷灭",
- yimie2: "夷灭",
- yimie_info: "每回合限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力(Y为其体力值)。",
- ruilve: "睿略",
- ruilve2: "睿略",
- ruilve_info: "主公技,其他晋势力角色的出牌阶段限一次,该角色可以将一张带有伤害标签的基本牌或锦囊牌交给你。",
- tairan: "泰然",
- tairan2: "泰然",
- tairan_info: "锁定技,回合结束时,你将体力回复至体力上限,并将手牌摸至体力上限(称为“泰然”牌,且至多摸五张)。然后你的下一个出牌阶段开始时,你失去上一次以此法回复的体力值的体力,弃置所有“泰然”牌。",
- gz_jin_simayi: "司马懿",
- gz_jin_zhangchunhua: "张春华",
- gz_jin_simazhao: "司马昭",
- gz_jin_wangyuanji: "王元姬",
- gz_jin_simashi: "司马师",
- gz_jin_xiahouhui: "夏侯徽",
- xinquanbian: "权变",
- xinquanbian_info: "出牌阶段,每当你首次使用/打出一种花色的手牌时,你可以从牌堆顶的X张牌中获得一张与此牌花色不同的牌,并将其余牌以任意顺序置于牌堆顶。出牌阶段,你至多可使用X张非装备手牌。(X为你的体力上限)",
- shibao: "石苞",
- zhuosheng: "擢升",
- zhuosheng_info: "出牌阶段,①你使用本轮内得到的基本牌时无次数和距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。",
- zhuosheng_info_guozhan: "出牌阶段,①你使用本轮内得到的基本牌时无距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。",
- jin_yanghuiyu: "晋羊徽瑜",
- jin_yanghuiyu_prefix: "晋",
- gz_jin_yanghuiyu: "羊徽瑜",
- huirong: "慧容",
- huirong_info: "隐匿技,锁定技。当你登场后,你令一名角色将手牌数摸至/弃至与体力值相同(至多摸至五张)。",
- ciwei: "慈威",
- ciwei_info: "一名角色于其回合内使用第二张牌时,若此牌为基本牌或普通锦囊牌,则你可以弃置一张牌,取消此牌的所有目标。",
- caiyuan: "才媛",
- caiyuan_info: "锁定技。回合结束时,若你于你的上一个回合结束后未扣减过体力,则你摸两张牌。",
- simazhou: "司马伷",
- caiwang: "才望",
- caiwang_info: "当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。",
- naxiang: "纳降",
- naxiang2: "纳降",
- naxiang_info: "锁定技,当你受到其他角色造成的伤害后,或你对其他角色造成伤害后,你对其发动〖才望①〗时的“弃置”改为“获得”直到你的下回合开始。",
- cheliji: "彻里吉",
- chexuan: "车悬",
- chexuan_info: "出牌阶段,若你的装备区里没有宝物牌,你可弃置一张黑色牌,选择一张【舆】置入你的装备区;当你失去装备区里的宝物牌后,你可进行判定,若结果为黑色,将一张随机的【舆】置入你的装备区。",
- qiangshou: "羌首",
- qiangshou_info: "锁定技,若你的装备区内有宝物牌,你与其他角色的距离-1。",
- cheliji_sichengliangyu: "四乘粮舆",
- cheliji_sichengliangyu_bg: "粮",
- cheliji_sichengliangyu_info: "一名角色的回合结束时,若你的手牌数小于体力值,你可以摸两张牌,然后弃置此牌。",
- cheliji_tiejixuanyu: "铁蒺玄舆",
- cheliji_tiejixuanyu_bg: "蒺",
- cheliji_tiejixuanyu_info: "其他角色的回合结束时,若其本回合未造成过伤害,你可以令其弃置两张牌,然后弃置此牌。",
- cheliji_feilunzhanyu: "飞轮战舆",
- cheliji_feilunzhanyu_bg: "轮",
- cheliji_feilunzhanyu_info: "其他角色的回合结束时,若其本回合使用过非基本牌,你可以令其交给你一张牌,然后弃置此牌。",
- weiguan: "卫瓘",
- zhongyun: "忠允",
- zhongyun2: "忠允",
- zhongyun_info: "锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复1点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。",
- shenpin: "神品",
- shenpin_info: "当一名角色的判定牌生效前,你可以打出一张与判定牌颜色不同的牌代替之。",
- zhongyan: "钟琰",
- bolan: "博览",
- bolan_info: "①出牌阶段开始时,你可从三个描述中带有“出牌阶段限一次”的技能中选择一个,令当前回合角色获得直至此阶段结束。②其他角色出牌阶段限一次,其可以失去1点体力,令你发动一次〖博览①〗。",
- yifa: "仪法",
- yifa2: "仪法",
- yifa_info: "锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到其回合结束。",
- ol_huaxin: "OL华歆",
- ol_huaxin_prefix: "OL",
- caozhao: "草诏",
- caozhao_backup: "草诏",
- caozhao_info: "出牌阶段限一次,你可展示一张手牌并声明一种未以此法声明过的基本牌或普通锦囊牌,令一名体力不大于你的其他角色选择一项:令此牌视为你声明的牌,或其失去1点体力。然后若此牌声明成功,然后你可将其交给一名其他角色。",
- olxibing: "息兵",
- olxibing_info: "当你受到其他角色造成的伤害后,你可弃置你或该角色两张牌,然后你们中手牌少的角色摸两张牌,以此法摸牌的角色不能使用牌指定你为目标直到回合结束。",
- recaiwang: "才望",
- recaiwang_info: "①当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。②若你的手牌数为1,则你可以将该手牌当做【闪】使用或打出。③若你的装备区牌数为1,则你可以将该装备当做【无懈可击】使用或打出。④若你的判定区牌数为1,则你可以将该延时锦囊牌当做【杀】使用或打出。",
- recaiwang_hand: "才望",
- recaiwang_equip: "才望",
- recaiwang_judge: "才望",
- yangyan: "杨艳",
- xuanbei: "选备",
- xuanbei_info: "①游戏开始时,你从牌堆中获得两张具有应变标签的牌。②每回合限一次。当你使用的具有应变标签的牌结算结束后,你可将此牌对应的所有实体牌交给一名其他角色。",
- xianwan: "娴婉",
- xianwan_info: "①当你需要使用【闪】时,若你的武将牌未横置,则你可以横置武将牌并视为使用【闪】。②当你需要使用【杀】时,若你的武将牌横置,则你可以重置武将牌并视为使用【杀】。",
- yangzhi: "杨芷",
- wanyi: "婉嫕",
- wanyi_info: "每回合每项限一次。出牌阶段,你可以将一张具有应变效果的牌当做【逐近弃远】/【出其不意】/【水淹七军】/【洞烛先机】使用。",
- maihuo: "埋祸",
- maihuo_info: "①当你成为其他角色使用【杀】的目标后,若此【杀】不为转化牌且有对应的实体牌且其武将牌上没有“祸”且你是此牌的唯一目标,则你可以令此牌对你无效,并将此【杀】置于其武将牌上,称为“祸”。②一名其他角色的出牌阶段开始时,若其武将牌上有“祸”,则其对你使用此“祸”(有距离限制且计入次数限制,若你不是此牌的合法目标,则改为将此“祸”置入弃牌堆)。③当你对有“祸”的其他角色造成伤害后,你移去其“祸”。",
- xinchang: "辛敞",
- canmou: "参谋",
- canmou_info: "一名角色使用普通锦囊牌指定第一个目标时,若其手牌数为全场唯一最多,则你可以为此牌增加一个额外目标。",
- congjian: "从鉴",
- congjian_info: "一名其他角色成为普通锦囊牌的唯一目标时,若其体力值为全场唯一最多,则你也可以成为此牌的目标。此牌结算结束后,若你受到过渠道为此牌的伤害,则你摸两张牌。",
- xuangongzhu: "晋宣公主",
- gz_xuangongzhu: "宣公主",
- xuangongzhu_prefix: "晋",
- gaoling: "高陵",
- gaoling_info: "隐匿技。当你于回合外明置此武将牌时,你可以令一名角色回复1点体力。",
- qimei: "齐眉",
- qimei_info: "准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。",
- ybzhuiji: "追姬",
- ybzhuiji_info: "出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。",
- jin_yanghu: "晋羊祜",
- jin_yanghu_prefix: "晋",
- huaiyuan: "怀远",
- huaiyuanx: "绥",
- huaiyuan_info: "①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。",
- chongxin: "崇信",
- chongxin_info: "出牌阶段限一次,你可重铸一张牌,且令一名有手牌的其他角色也重铸一张牌。",
- dezhang: "德彰",
- dezhang_info: "觉醒技。准备阶段,若你没有“绥”,则你减1点体力上限并获得〖卫戍〗。",
- weishu: "卫戍",
- weishu_info: "锁定技。①当你于摸牌阶段外不因〖卫戍①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戍②〗而弃置牌后,你弃置一名其他角色的一张牌。",
- jin_jiachong: "晋贾充",
- jin_jiachong_prefix: "晋",
- xiongshu: "凶竖",
- xiongshu_info: "其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张手牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。",
- jianhui: "奸回",
- jianhui_info: "锁定技。当你造成伤害后,若受伤角色为A,则你摸一张牌;当你受到伤害后,若伤害来源为A,则A弃置一张牌。(A为除本次伤害外最近一次对你造成过伤害的角色)",
- xinxuanbei: "选备",
- xinxuanbei_info: "出牌阶段限一次。你可选择一名其他角色区域内的一张牌。然后其对你使用对应实体牌为此牌的【杀】。然后若此【杀】,未对你造成过伤害,你摸一张牌;对你造成过伤害,你摸两张牌。",
- xinwanyi: "婉嫕",
- xinwanyi_info: "①当你使用【杀】或普通锦囊牌指定其他角色为唯一目标后,你可将其的一张牌置于你的武将牌上作为“嫕”。②你不能使用/打出/弃置与“嫕”花色相同的牌。③结束阶段或当你受到伤害后,你令一名角色获得你的一张“嫕”。",
- jin_guohuai: "郭槐",
- zhefu: "哲妇",
- zhefu_info: "当你于回合外使用或打出牌后,你可令一名有手牌的其他角色选择一项:⒈弃置一张名称相同的牌。⒉受到你造成的1点伤害。",
- yidu: "遗毒",
- yidu_info: "当你使用的【杀】或伤害性锦囊牌结算结束后,你可以展示一名未受到过渠道为此牌伤害的目标角色的至多三张手牌。若这些牌颜色均相同,则你弃置这些牌。",
- wangxiang: "王祥",
- bingxin: "冰心",
- bingxin_info: "每种牌名每回合限一次。当你需要使用基本牌时,若你的手牌数等于体力值且这些牌的颜色均相同,则你可以摸一张牌,视为使用一张基本牌。",
- ol_lisu: "OL李肃",
- ol_lisu_prefix: "OL",
- qiaoyan: "巧言",
- qiaoyan_info: "锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。",
- xianzhu: "献珠",
- xianzhu_info: "锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择你攻击范围内的一名角色B,视为A对B使用一张【杀】。",
- chengjichengcui: "成济成倅",
- oltousui: "透髓",
- oltousui_info: "你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。",
- olchuming: "畜鸣",
- olchuming_info: "锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。",
-
- yingbian_pack1: "文德武备·理",
- yingbian_pack2: "文德武备·备",
- yingbian_pack3: "文德武备·果",
- yingbian_pack4: "文德武备·戒",
- yingbian_pack5: "文德武备·约",
- },
- };
-});
diff --git a/character/yingbian/card.js b/character/yingbian/card.js
new file mode 100644
index 000000000..262502cad
--- /dev/null
+++ b/character/yingbian/card.js
@@ -0,0 +1,33 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
+const cards = {
+ cheliji_sichengliangyu: {
+ fullskin: true,
+ vanish: true,
+ derivation: "cheliji",
+ destroy: "chexuan",
+ type: "equip",
+ subtype: "equip5",
+ skills: ["cheliji_sichengliangyu"],
+ },
+ cheliji_tiejixuanyu: {
+ fullskin: true,
+ vanish: true,
+ derivation: "cheliji",
+ destroy: "chexuan",
+ type: "equip",
+ subtype: "equip5",
+ skills: ["cheliji_tiejixuanyu"],
+ },
+ cheliji_feilunzhanyu: {
+ fullskin: true,
+ vanish: true,
+ derivation: "cheliji",
+ destroy: "chexuan",
+ type: "equip",
+ subtype: "equip5",
+ skills: ["cheliji_feilunzhanyu"],
+ },
+};
+
+export default cards;
diff --git a/character/yingbian/character.js b/character/yingbian/character.js
new file mode 100644
index 000000000..8d8589904
--- /dev/null
+++ b/character/yingbian/character.js
@@ -0,0 +1,27 @@
+const characters = {
+ chengjichengcui: ["male", "jin", 6, ["oltousui", "olchuming"]],
+ wangxiang: ["male", "jin", 3, ["bingxin"]],
+ jin_jiachong: ["male", "jin", 3, ["xiongshu", "jianhui"]],
+ xuangongzhu: ["female", "jin", 3, ["gaoling", "qimei", "ybzhuiji"], ["hiddenSkill"]],
+ xinchang: ["male", "jin", 3, ["canmou", "congjian"]],
+ yangzhi: ["female", "jin", 3, ["xinwanyi", "maihuo"]],
+ yangyan: ["female", "jin", 3, ["xinxuanbei", "xianwan"]],
+ ol_huaxin: ["male", "wei", 3, ["caozhao", "olxibing"]],
+ zhongyan: ["female", "jin", 3, ["bolan", "yifa"], ["clan:颍川钟氏"]],
+ weiguan: ["male", "jin", 3, ["zhongyun", "shenpin"]],
+ cheliji: ["male", "qun", 4, ["chexuan", "qiangshou"]],
+ simazhou: ["male", "jin", 4, ["recaiwang", "naxiang"]],
+ ol_lisu: ["male", "qun", 3, ["qiaoyan", "xianzhu"]],
+ jin_yanghuiyu: ["female", "jin", 3, ["huirong", "ciwei", "caiyuan"], ["hiddenSkill"]],
+ shibao: ["male", "jin", 4, ["zhuosheng"]],
+ jin_zhangchunhua: ["female", "jin", 3, ["huishi", "qingleng", "xuanmu"], ["hiddenSkill"]],
+ jin_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "xinquanbian"], ["hiddenSkill"]],
+ jin_wangyuanji: ["female", "jin", 3, ["shiren", "yanxi"], ["hiddenSkill"]],
+ jin_simazhao: ["male", "jin", 3, ["tuishi", "xinchoufa", "zhaoran", "chengwu"], ["zhu", "hiddenSkill"]],
+ jin_xiahouhui: ["female", "jin", 3, ["baoqie", "jyishi", "shiduo"], ["hiddenSkill"]],
+ jin_simashi: ["male", "jin", "3/4", ["taoyin", "yimie", "ruilve", "tairan"], ["hiddenSkill", "zhu"]],
+ zhanghuyuechen: ["male", "jin", 4, ["xijue"]],
+ duyu: ["male", "jin", 4, ["sanchen", "zhaotao"]],
+};
+
+export default characters;
diff --git a/character/yingbian/characterFilter.js b/character/yingbian/characterFilter.js
new file mode 100644
index 000000000..dfc3d193c
--- /dev/null
+++ b/character/yingbian/characterFilter.js
@@ -0,0 +1,3 @@
+const characterFilters = {};
+
+export default characterFilters;
diff --git a/character/yingbian/characterReplace.js b/character/yingbian/characterReplace.js
new file mode 100644
index 000000000..1d71bdc94
--- /dev/null
+++ b/character/yingbian/characterReplace.js
@@ -0,0 +1,9 @@
+const characterReplaces = {
+ yanghu: ["jin_yanghu", "dc_yanghu", "sp_yanghu"],
+ jiachong: ["dc_jiachong", "jin_jiachong", "jiachong"],
+ yangyan: ["yangyan", "old_yangyan"],
+ yangzhi: ["yangzhi", "old_yangzhi"],
+ zhongyan: ["zhongyan", "clan_zhongyan"],
+};
+
+export default characterReplaces;
diff --git a/character/yingbian/dynamicTranslate.js b/character/yingbian/dynamicTranslate.js
new file mode 100644
index 000000000..cdee02b0a
--- /dev/null
+++ b/character/yingbian/dynamicTranslate.js
@@ -0,0 +1,4 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
+const dynamicTranslates = {};
+export default dynamicTranslates;
diff --git a/character/yingbian/index.js b/character/yingbian/index.js
new file mode 100644
index 000000000..fadefabd1
--- /dev/null
+++ b/character/yingbian/index.js
@@ -0,0 +1,34 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+import characters from "./character.js";
+import cards from "./card.js";
+import pinyins from "./pinyin.js";
+import skills from "./skill.js";
+import translates from "./translate.js";
+import characterIntros from "./intro.js";
+import characterFilters from "./characterFilter.js";
+import characterReplaces from "./characterReplace.js";
+import dynamicTranslates from "./dynamicTranslate.js";
+import perfectPairs from "./perfectPairs.js";
+import voices from "./voices.js";
+import { characterSort, characterSortTranslate } from "./sort.js";
+
+game.import("character", function () {
+ return {
+ name: "yingbian",
+ connect: true,
+ character: { ...characters },
+ characterSort: {
+ yingbian: characterSort,
+ },
+ characterFilter: { ...characterFilters },
+ characterTitle: {},
+ dynamicTranslate: { ...dynamicTranslates },
+ characterIntro: { ...characterIntros },
+ characterReplace: { ...characterReplaces },
+ card: { ...cards },
+ skill: { ...skills },
+ perfectPair: { ...perfectPairs },
+ translate: { ...translates, ...voices, ...characterSortTranslate },
+ pinyins: { ...pinyins },
+ };
+});
diff --git a/character/yingbian/intro.js b/character/yingbian/intro.js
new file mode 100644
index 000000000..30fd91b98
--- /dev/null
+++ b/character/yingbian/intro.js
@@ -0,0 +1,20 @@
+const characterIntro = {
+ zhanghuyuechen: "张虎,生卒年不详,雁门马邑(今山西朔城区大夫庄)人。三国时期曹魏将领。名将张辽之子。官至偏将军,袭封晋阳侯,有一子张统。乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。",
+ duyu: "杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。",
+ xiahouhui: "夏侯徽(211年-234年),字媛容,沛国谯县(今安徽亳州)人,司马师第一任妻子。征南大将军夏侯尚之女,母德阳乡主为大司马曹真之妹。夏侯徽与司马师之间,生有五个女儿。夏侯徽很有见识器度,每当司马师有什么想法时,都由她从旁策划协助。当时司马师之父司马懿位居上将重位,而他的儿子们都有雄才大略。夏侯徽深知司马师绝非曹魏忠臣,而司马师对出身曹魏家族的夏侯徽也非常顾忌。青龙二年(234年),正逢“大疫”、“大病”之年,夏侯徽被司马师毒杀,时年二十四岁,死后葬于峻平陵。西晋建国后,追谥夏侯徽为景怀皇后。",
+ shibao: "石苞(?~273年),字仲容,渤海南皮(今河北省南皮县)人。三国时曹魏至西晋重要将领,西晋开国功臣。西晋建立后,历任大司马、侍中、司徒等职,封乐陵郡公,卒后谥号为“武”。",
+ simazhou: "司马伷(227年~283年6月12日),字子将,河内郡温县(今河南省温县)人。西晋宗室、将领,晋宣帝司马懿第三子,伏太妃所生。晋景帝司马师、文帝司马昭的同父异母弟,晋武帝司马炎的叔父。司马伷少有才气,在曹魏历任宁朔将军、散骑常侍、征虏将军等职,先后受封南安亭侯、东武乡侯,五等爵制建立后,改封南皮伯。西晋建立后,获封东莞郡王,入朝任尚书右仆射、抚军将军,出外拜镇东大将军。后改封琅邪王,加开府仪同三司。西晋伐吴时,率军出涂中,孙皓向他投降并奉上玉玺。战后因功拜大将军,增邑三千户。太康四年(283年),司马伷去世,享年五十七岁。谥号为武,世称“琅邪武王”。著有《周官宁朔新书》八卷,今已亡佚。",
+ huangzu: "黄祖(?-208年),东汉末年将领。刘表任荆州牧时,黄祖出任江夏太守。初平二年(191年),黄祖在与长沙太守孙坚交战时,其部下将孙坚射死,因此与孙家结下仇怨。之后,黄祖多次率部与东吴军队交战,射杀凌操、徐琨等人。建安十三年(208年),在与孙权的交战中,兵败被杀。",
+ cheliji: "彻里吉是历史小说《三国演义》中的虚构人物,西羌国王。蜀相诸葛亮伐魏,魏都督曹真驰书赴羌,国王彻里吉即命雅丹丞相与越吉元帅起羌兵一十五万、并战车直扣西平关。后军大败,越吉亡,雅丹被俘,亮将所获羌兵及车马器械,尽给还雅丹,俱放回国。彻里吉感蜀恩义,与之结盟。正史中没有关于彻里吉的记载。",
+ weiguan: "卫瓘(220年-291年),字伯玉。河东郡安邑县(今山西省夏县)人。三国曹魏后期至西晋初年重臣、书法家,曹魏尚书卫觊之子。卫瓘出身官宦世家,年轻时仕官于曹魏,历任尚书郎、散骑常侍、侍中、廷尉等职。后以镇西军司、监军身份参与伐蜀战争。蜀汉亡后,与钟会一道逮捕邓艾;钟会谋反时,又成功平息叛乱,命田续杀邓艾父子。回师后转任督徐州诸军事、镇东将军,封菑阳侯。西晋建立后,历任青州、幽州刺史、征东大将军等职,成功化解北方边境威胁,因功进爵菑阳公。后入朝为尚书令、侍中,又升任司空,领太子少傅。后逊位,拜太保。晋惠帝即位后,与贾皇后对立,终在政变中满门遇害,享年七十二岁。卫瓘善隶书及章草。不仅兼工各体,还能学古人之长,是颇有创意的书法家。唐朝张怀瓘《书断》中评其章草为“神品”。",
+ zhongyan: " 钟琰 (?—?年)颍川人,王浑之妻。生卒年不详,约魏末晋初间前后在世。王浑的妻子钟琰,是颍川人,为魏太傅钟繇的曾孙女,父亲钟徽,为黄门郎。她平时广泛阅读各种书籍,因此几岁的时候就能撰写文章。她聪慧弘雅,善于啸咏,她的礼仪法度,为中表所推崇,她写有文集五卷。",
+ yangyan: "杨艳(238年-274年8月25日),字琼芝,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第一任皇后,曹魏通事郎杨炳之女。自幼父母双亡,为舅舅赵俊所养,跟随继母段氏生活。聪明贤慧,善于书法,天生丽质,娴熟女红,嫁给了世子司马炎。泰始元年(265年),晋武帝即位,建立西晋。泰始二年(266年),杨艳受册为皇后,深得晋武帝宠幸,生下三子三女,包括晋惠帝司马衷。泰始十年(274年),去世,时年三十七,陪葬于峻阳陵,谥号武元皇后。",
+ yangzhi: "杨芷(259年-292年3月6日),字季兰,小字男胤,弘农郡华阴县(今陕西省华阴市)人,晋武帝司马炎第二任皇后,东汉太尉杨震幼子杨奉后裔,东汉末年东莱太守、蓩亭侯杨众曾孙女,西晋太傅杨骏与嫡妻庞氏之女,武元皇后杨艳堂妹。咸宁二年(276年),立为皇后,史称“婉嫕有妇德, 美映椒房”,得宠于晋武帝。生渤海殇王,早薨,之后再无生育。其父杨骏擅权引起皇后贾南风忌恨,贾南风联络汝南王司马亮、楚王司马玮发动政变,杀死杨骏,并唆使大臣上书状告杨芷谋反,让晋惠帝司马衷将其贬为庶人,押到金墉城居住。元康二年(292年),杨芷冻饿而死,谥号武悼皇后。",
+ xinchang: "辛敞(生卒年不详),字泰雍,陇西人氏,是曹魏时代官员。卫尉辛毗之子,辛宪英之弟。",
+ xuangongzhu: "高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。",
+ jin_guohuai: "郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。",
+ wangxiang: "王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。",
+ chengjichengcui: "成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。",
+};
+
+export default characterIntro;
diff --git a/character/yingbian/perfectPairs.js b/character/yingbian/perfectPairs.js
new file mode 100644
index 000000000..5753687ee
--- /dev/null
+++ b/character/yingbian/perfectPairs.js
@@ -0,0 +1,6 @@
+export default {
+ jin_simayi: ["jin_zhangchunhua", "shibao", "duyu"],
+ jin_simazhao: ["jin_wangyuanji"],
+ jin_simashi: ["jin_xiahouhui", "jin_yanghuiyu"],
+ xuangongzhu: ["duyu"],
+};
diff --git a/character/yingbian/pinyin.js b/character/yingbian/pinyin.js
new file mode 100644
index 000000000..bc893d3fb
--- /dev/null
+++ b/character/yingbian/pinyin.js
@@ -0,0 +1,2 @@
+const pinyins = {};
+export default pinyins;
diff --git a/character/yingbian/skill.js b/character/yingbian/skill.js
new file mode 100644
index 000000000..074eaa9dc
--- /dev/null
+++ b/character/yingbian/skill.js
@@ -0,0 +1,3972 @@
+import { lib, game, ui, get, ai, _status } from "../../noname.js";
+
+/** @type { importCharacterConfig['skill'] } */
+const skills = {
+ //二成
+ oltousui: {
+ audio: 2,
+ enable: "chooseToUse",
+ viewAsFilter: function (player) {
+ return player.countCards("he");
+ },
+ viewAs: {
+ name: "sha",
+ suit: "none",
+ number: null,
+ isCard: true,
+ },
+ filterCard: true,
+ selectCard: [1, Infinity],
+ position: "he",
+ check: function (card) {
+ const player = get.player();
+ return 4.5 + (player.hasSkill("olchuming") ? 1 : 0) - 1.5 * ui.selected.cards.length - get.value(card);
+ },
+ popname: true,
+ ignoreMod: true,
+ precontent: function* (event, map) {
+ var player = map.player;
+ var evt = event.getParent();
+ if (evt.dialog && typeof evt.dialog == "object") evt.dialog.close();
+ player.logSkill("oltousui");
+ delete event.result.skill;
+ var cards = event.result.cards;
+ player.loseToDiscardpile(cards, ui.cardPile, false, "blank").log = false;
+ var shownCards = cards.filter(i => get.position(i) == "e"),
+ handcardsLength = cards.length - shownCards.length;
+ if (shownCards.length) {
+ player.$throw(shownCards, null);
+ game.log(player, "将", shownCards, "置于了牌堆底");
+ }
+ if (handcardsLength > 0) {
+ player.$throw(handcardsLength, null);
+ game.log(player, "将", get.cnNumber(handcardsLength), "张牌置于了牌堆底");
+ }
+ game.delayex();
+ var viewAs = new lib.element.VCard({ name: event.result.card.name, isCard: true });
+ event.result.card = viewAs;
+ event.result.cards = [];
+ event.result._apply_args = {
+ shanReq: cards.length,
+ oncard: () => {
+ var evt = get.event();
+ for (var target of game.filterPlayer(null, null, true)) {
+ var id = target.playerid;
+ var map = evt.customArgs;
+ if (!map[id]) map[id] = {};
+ map[id].shanRequired = evt.shanReq;
+ }
+ },
+ };
+ },
+ ai: {
+ order: function (item, player) {
+ return get.order({ name: "sha" }) + 0.1;
+ },
+ result: { player: 1 },
+ keepdu: true,
+ respondSha: true,
+ skillTagFilter: (player, tag, arg) => {
+ if (tag == "respondSha" && arg != "use") return false;
+ },
+ },
+ },
+ olchuming: {
+ audio: 2,
+ trigger: {
+ source: "damageBegin1",
+ player: "damageBegin3",
+ },
+ filter: function (event, player) {
+ if (event.source === event.player) return false;
+ if (!event.card || !event.cards || !event.cards.length) return true;
+ let target = event[player === event.source ? "player" : "source"];
+ return target && target.isIn();
+ },
+ forced: true,
+ content: function* (event, map) {
+ var player = map.player,
+ trigger = map.trigger;
+ if (!trigger.card || !trigger.cards || !trigger.cards.length) {
+ trigger.num++;
+ event.finish();
+ return;
+ } else {
+ var target = trigger[trigger.source == player ? "player" : "source"];
+ trigger._olchuming = true;
+ target.addTempSkill("olchuming_effect");
+ }
+ },
+ ai: {
+ effect: {
+ player: function (card, player, target) {
+ if (!get.tag(card, "damage")) return;
+ if (!lib.card[card.name] || !card.cards || !card.cards.length) return [1, 0, 1, -1];
+ return [1, -1];
+ },
+ },
+ },
+ subSkill: {
+ effect: {
+ charlotte: true,
+ trigger: { global: "phaseEnd" },
+ forced: true,
+ popup: false,
+ content: function* (event, map) {
+ var player = map.player;
+ var mapx = {};
+ var history = player.getHistory("damage").concat(player.getHistory("sourceDamage"));
+ history.forEach(evt => {
+ if (!evt._olchuming) return;
+ var target = evt[evt.source == player ? "player" : "source"];
+ if (!target.isIn()) return;
+ var cards = evt.cards.filterInD("d");
+ if (!cards.length) return;
+ if (!mapx[target.playerid]) mapx[target.playerid] = [];
+ mapx[target.playerid].addArray(cards);
+ });
+ var entries = Object.entries(mapx).map(entry => {
+ return [(_status.connectMode ? lib.playerOL : game.playerMap)[entry[0]], entry[1]];
+ });
+ if (!entries.length) {
+ event.finish();
+ return;
+ }
+ player.logSkill(
+ "olchuming_effect",
+ entries.map(i => i[0])
+ );
+ entries.sort((a, b) => lib.sort.seat(a[0], b[0]));
+ for (var entry of entries) {
+ var current = entry[0],
+ cards = entry[1];
+ var list = ["jiedao", "guohe"].filter(i => player.canUse(new lib.element.VCard({ name: i, cards: cards }), current, false));
+ if (!list.length) return;
+ var result = {};
+ if (list.length == 1) result = { bool: true, links: [["", "", list[0]]] };
+ else
+ result = yield player
+ .chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`, [list, "vcard"]], true)
+ .set("ai", button => {
+ var player = get.player();
+ return get.effect(get.event("currentTarget"), { name: button.link[2] }, player, player);
+ })
+ .set("currentTarget", current);
+ if (result.bool) {
+ var card = get.autoViewAs({ name: result.links[0][2] }, cards);
+ if (player.canUse(card, current, false)) player.useCard(card, cards, current, false);
+ }
+ }
+ },
+ },
+ },
+ },
+ bingxin: {
+ audio: 2,
+ enable: "chooseToUse",
+ hiddenCard: function (player, name) {
+ if (get.type(name) == "basic" && lib.inpile.includes(name) && !player.getStorage("bingxin_count").includes(name)) return true;
+ },
+ filter: function (event, player) {
+ if (event.type == "wuxie") return false;
+ var hs = player.getCards("h");
+ if (hs.length != Math.max(0, player.hp)) return false;
+ if (hs.length > 1) {
+ var color = get.color(hs[0], player);
+ for (var i = 1; i < hs.length; i++) {
+ if (get.color(hs[i], player) != color) return false;
+ }
+ }
+ var storage = player.storage.bingxin_count;
+ for (var i of lib.inpile) {
+ if (get.type(i) != "basic") continue;
+ if (storage && storage.includes(i)) continue;
+ var card = { name: i, isCard: true };
+ if (event.filterCard(card, player, event)) return true;
+ if (i == "sha") {
+ for (var j of lib.inpile_nature) {
+ card.nature = j;
+ if (event.filterCard(card, player, event)) return true;
+ }
+ }
+ }
+ return false;
+ },
+ chooseButton: {
+ dialog: function (event, player) {
+ var list = [];
+ var storage = player.storage.bingxin_count;
+ for (var i of lib.inpile) {
+ if (get.type(i) != "basic") continue;
+ if (storage && storage.includes(i)) continue;
+ var card = { name: i, isCard: true };
+ if (event.filterCard(card, player, event)) list.push(["基本", "", i]);
+ if (i == "sha") {
+ for (var j of lib.inpile_nature) {
+ card.nature = j;
+ if (event.filterCard(card, player, event)) list.push(["基本", "", i, j]);
+ }
+ }
+ }
+ return ui.create.dialog("冰心", [list, "vcard"], "hidden");
+ },
+ check: function (button) {
+ if (button.link[2] == "shan") return 3;
+ var player = _status.event.player;
+ if (button.link[2] == "jiu") {
+ if (player.getUseValue({ name: "jiu" }) <= 0) return 0;
+ if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" });
+ return 0;
+ }
+ return player.getUseValue({ name: button.link[2], nature: button.link[3] }) / 4;
+ },
+ backup: function (links, player) {
+ return {
+ selectCard: -1,
+ filterCard: () => false,
+ viewAs: {
+ name: links[0][2],
+ nature: links[0][3],
+ isCard: true,
+ },
+ precontent: function () {
+ player.logSkill("bingxin");
+ player.draw();
+ delete event.result.skill;
+ var name = event.result.card.name;
+ player.addTempSkill("bingxin_count");
+ player.markAuto("bingxin_count", [name]);
+ },
+ };
+ },
+ prompt: function (links, player) {
+ var name = links[0][2];
+ var nature = links[0][3];
+ return "摸一张并视为使用" + (get.translation(nature) || "") + get.translation(name);
+ },
+ },
+ ai: {
+ order: 10,
+ respondShan: true,
+ respondSha: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (arg == "respond") return false;
+ var hs = player.getCards("h");
+ if (hs.length != Math.max(0, hs.length)) return false;
+ if (hs.length > 1) {
+ var color = get.color(hs[0], player);
+ for (var i = 1; i < hs.length; i++) {
+ if (get.color(hs[i], player) != color) return false;
+ }
+ }
+ var storage = player.storage.bingxin_count;
+ if (storage && storage.includes("s" + tag.slice(8))) return false;
+ },
+ result: {
+ player: function (player) {
+ if (_status.event.dying) return get.attitude(player, _status.event.dying);
+ return 1;
+ },
+ },
+ },
+ subSkill: { count: { charlotte: true, onremove: true } },
+ },
+ zhefu: {
+ audio: 2,
+ trigger: { player: ["useCard", "respond"] },
+ direct: true,
+ filter: function (event, player) {
+ return (
+ player != _status.currentPhase &&
+ game.hasPlayer(function (current) {
+ return current != player && current.countCards("h") > 0;
+ })
+ );
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("zhefu"), "令一名有手牌的其他角色弃置一张【" + get.translation(trigger.card.name) + "】,否则受到你造成的1点伤害。", function (card, player, target) {
+ return target != player && target.countCards("h") > 0;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.damageEffect(target, player, player) / Math.sqrt(target.countCards("h"));
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ event.target = target;
+ player.logSkill("zhefu", target);
+ var name = trigger.card.name;
+ target
+ .chooseToDiscard("he", { name: name }, "弃置一张【" + get.translation(name) + "】或受到1点伤害")
+ .set("ai", function (card) {
+ var player = _status.event.player;
+ if (_status.event.take || (get.name(card) == "tao" && !player.hasJudge("lebu"))) return 0;
+ return 8 - get.value(card);
+ })
+ .set("take", get.damageEffect(target, player, target) >= 0);
+ } else event.finish();
+ "step 2";
+ if (!result.bool) target.damage();
+ },
+ },
+ yidu: {
+ audio: 2,
+ trigger: { player: "useCardAfter" },
+ filter: function (event, player) {
+ return (
+ (event.card.name == "sha" || (get.type(event.card, null, false) == "trick" && get.tag(event.card, "damage") > 0)) &&
+ event.targets.some(target => {
+ return (
+ target.countCards("h") > 0 &&
+ !target.hasHistory("damage", function (evt) {
+ return evt.card == event.card;
+ })
+ );
+ })
+ );
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt2("yidu"), (card, player, target) => {
+ return _status.event.targets.includes(target);
+ })
+ .set(
+ "targets",
+ trigger.targets.filter(target => {
+ return (
+ target.countCards("h") > 0 &&
+ !target.hasHistory("damage", function (evt) {
+ return evt.card == trigger.card;
+ })
+ );
+ })
+ )
+ .set("ai", target => {
+ if (target.hasSkillTag("noh")) return 0;
+ return -get.attitude(player, target);
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ event.target = target;
+ player.logSkill("yidu", target);
+ player
+ .choosePlayerCard(target, "遗毒:展示" + get.translation(target) + "的至多三张手牌", true, "h", [1, Math.min(3, target.countCards("h"))])
+ .set("forceAuto", true)
+ .set("ai", function (button) {
+ if (ui.selected.buttons.length) return 0;
+ return 1 + Math.random();
+ });
+ } else event.finish();
+ "step 2";
+ var cards = result.cards;
+ player.showCards(cards, get.translation(player) + "对" + get.translation(target) + "发动了【遗毒】");
+ var color = get.color(cards[0], target);
+ var bool = true;
+ for (var i = 1; i < cards.length; i++) {
+ if (get.color(cards[i], target) != color) {
+ bool = false;
+ break;
+ }
+ }
+ if (bool) target.discard(cards, "notBySelf").discarder = player;
+ },
+ },
+ xinwanyi: {
+ audio: "wanyi",
+ trigger: { player: "useCardToTargeted" },
+ filter: function (event, player) {
+ return player != event.target && event.targets.length == 1 && (event.card.name == "sha" || get.type(event.card, false) == "trick") && event.target.countCards("he") > 0;
+ },
+ locked: false,
+ logTarget: "target",
+ check: function (event, player) {
+ return get.effect(event.target, { name: "guohe_copy2" }, player, player) > 0;
+ },
+ prompt2: "将该角色的一张牌置于武将牌上作为“嫕”",
+ content: function () {
+ "step 0";
+ event.target = trigger.target;
+ player.choosePlayerCard(event.target, true, "he");
+ "step 1";
+ if (result.bool) {
+ var cards = result.cards;
+ player.addToExpansion(cards, target, "give").gaintag.add("xinwanyi");
+ }
+ },
+ mod: {
+ cardEnabled: function (card, player) {
+ var cards = player.getExpansions("xinwanyi");
+ if (cards.length) {
+ var suit = get.suit(card);
+ if (suit == "none") return;
+ for (var i of cards) {
+ if (get.suit(i, player) == suit) return false;
+ }
+ }
+ },
+ cardRespondable: function (card, player) {
+ var cards = player.getExpansions("xinwanyi");
+ if (cards.length) {
+ var suit = get.suit(card);
+ if (suit == "none") return;
+ for (var i of cards) {
+ if (get.suit(i, player) == suit) return false;
+ }
+ }
+ },
+ cardSavable: function (card, player) {
+ var cards = player.getExpansions("xinwanyi");
+ if (cards.length) {
+ var suit = get.suit(card);
+ if (suit == "none") return;
+ for (var i of cards) {
+ if (get.suit(i, player) == suit) return false;
+ }
+ }
+ },
+ cardDiscardable: function (card, player) {
+ var cards = player.getExpansions("xinwanyi");
+ if (cards.length) {
+ var suit = get.suit(card);
+ if (suit == "none") return;
+ for (var i of cards) {
+ if (get.suit(i, player) == suit) return false;
+ }
+ }
+ },
+ },
+ marktext: "嫕",
+ intro: {
+ markcount: "expansion",
+ content: "expansion",
+ },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ group: "xinwanyi_give",
+ subSkill: {
+ give: {
+ audio: "wanyi",
+ trigger: { player: ["phaseJieshuBegin", "damageEnd"] },
+ forced: true,
+ locked: false,
+ filter: function (event, player) {
+ return player.getExpansions("xinwanyi").length > 0;
+ },
+ content: function () {
+ "step 0";
+ player.chooseTarget(true, "婉嫕:令一名角色获得一张“嫕”").set("ai", function (target) {
+ return get.attitude(_status.event.player, target);
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ event.target = target;
+ player.line(target, "green");
+ var cards = player.getExpansions("xinwanyi");
+ if (cards.length == 1) event._result = { bool: true, links: cards };
+ else player.chooseButton(["令" + get.translation(target) + "获得一张“嫕”", cards], true);
+ } else event.finish();
+ "step 2";
+ if (result.bool) {
+ target.gain(result.links, player, "give");
+ }
+ },
+ },
+ },
+ },
+ xinxuanbei: {
+ audio: "xuanbei",
+ enable: "phaseUse",
+ usable: 1,
+ filter: function (event, player) {
+ return game.hasPlayer(current => lib.skill.xinxuanbei.filterTarget(null, player, current));
+ },
+ filterTarget: function (card, player, target) {
+ return target != player && target.countCards("hej") > 0;
+ },
+ content: function () {
+ "step 0";
+ player.choosePlayerCard(target, "hej", true);
+ "step 1";
+ if (result.bool) {
+ var card = result.cards[0];
+ var cardx = get.autoViewAs({ name: "sha" }, [card]);
+ if ((get.position(card) != "j" && !game.checkMod(card, target, "unchanged", "cardEnabled2", target)) || !target.canUse(cardx, player, false)) event.finish();
+ else {
+ var next = target.useCard(cardx, [card], player, false);
+ event.card = next.card;
+ }
+ } else event.finish();
+ "step 2";
+ var num = 1;
+ if (
+ player.hasHistory("damage", function (evt) {
+ return evt.card == event.card;
+ })
+ )
+ num++;
+ player.draw(num);
+ },
+ ai: {
+ order: 7,
+ result: {
+ player: function (player, target) {
+ return get.effect(target, { name: "guohe_copy" }, player, player) + get.effect(player, { name: "sha" }, target, player);
+ },
+ },
+ },
+ },
+ xiongshu: {
+ audio: 2,
+ trigger: { global: "phaseUseBegin" },
+ direct: true,
+ filter: function (event, player) {
+ return player != event.player && event.player.countCards("h") > 0 && player.countCards("he") >= player.countMark("xiongshu_count");
+ },
+ content: function () {
+ "step 0";
+ event.target = trigger.player;
+ var num = player.countMark("xiongshu_count");
+ if (num > 0)
+ player
+ .chooseToDiscard("he", num, get.prompt("xiongshu", trigger.player), "弃置" + get.cnNumber(num) + "张牌并展示其一张手牌")
+ .set("goon", get.attitude(player, event.target) < 0)
+ .set("ai", function (card) {
+ if (!_status.event.goon) return 0;
+ return 6 - _status.event.player.countMark("xiongshu_count") - get.value(card);
+ }).logSkill = ["xiongshu", trigger.player];
+ else
+ player
+ .chooseBool(get.prompt("xiongshu", trigger.player), "展示其一张牌")
+ .set("goon", get.attitude(player, event.target) < 0)
+ .set("ai", function (card) {
+ return _status.event.goon;
+ });
+ "step 1";
+ if (result.bool) {
+ if (!result.cards || !result.cards.length) player.logSkill("xiongshu", target);
+ player.addTempSkill("xiongshu_count", "roundStart");
+ player.addMark("xiongshu_count", 1, false);
+ }
+ if (result.bool && target.countCards("h") > 0) {
+ player.choosePlayerCard(target, true, "h");
+ } else event.finish();
+ "step 2";
+ var card = result.cards[0],
+ name = get.name(card),
+ str = get.translation(target);
+ player.showCards(card, get.translation(player) + "对" + str + "发动了【凶竖】");
+ player.addTempSkill("xiongshu_effect", "phaseUseAfter");
+ player.storage.xiongshu_effect = [card, name];
+ if (Math.random() < 0.5) {
+ target.storage.xiongshu_ai = name;
+ target.addTempSkill("xiongshu_ai", "phaseUseAfter");
+ }
+ player
+ .chooseControl("会使用", "不会使用")
+ .set("prompt", "预测:" + str + "是否会使用" + get.translation(name) + "?")
+ .set(
+ "choice",
+ (function () {
+ if (!target.hasValueTarget(card)) return 1;
+ return Math.random() < 0.5 ? 0 : 1;
+ })()
+ )
+ .set("ai", () => _status.event.choice);
+ "step 3";
+ player.storage.xiongshu_effect[2] = result.index == 0;
+ },
+ ai: { expose: 0.35 },
+ subSkill: {
+ ai: {
+ charlotte: true,
+ onremove: true,
+ ai: {
+ effect: {
+ player: function (card, player, target) {
+ if (card.name == player.storage.xiongshu_ai) return "zeroplayertarget";
+ },
+ },
+ },
+ },
+ count: {
+ charlotte: true,
+ onremove: true,
+ },
+ effect: {
+ trigger: { global: "phaseUseEnd" },
+ forced: true,
+ charlotte: true,
+ onremove: true,
+ filter: function (event, player) {
+ var info = player.storage.xiongshu_effect;
+ return Array.isArray(info) && event.player.isIn();
+ },
+ logTarget: "player",
+ content: function () {
+ var target = trigger.player;
+ var info = player.storage.xiongshu_effect;
+ var card = info[0];
+ if (
+ target.hasHistory("useCard", function (evt) {
+ return evt.card.name == info[1] && evt.getParent("phaseUse") == trigger;
+ }) == info[2]
+ )
+ target.damage();
+ else {
+ if (target.getCards("hej").includes(card)) player.gain(card, target, "give");
+ else if (get.position(card, true) == "d") player.gain(card, "gain2");
+ }
+ },
+ },
+ },
+ },
+ jianhui: {
+ audio: 2,
+ getLastPlayer: function (evt, player) {
+ var history = player.getAllHistory("damage");
+ if (!history.length) return null;
+ var i = history.indexOf(evt);
+ if (i == -1) i = history.length - 1;
+ else i--;
+ for (i; i >= 0; i--) {
+ if (history[i].source) return history[i].source;
+ }
+ return null;
+ },
+ trigger: { player: "damageEnd" },
+ forced: true,
+ filter: function (event, player) {
+ return event.source && event.source.isIn() && event.source == lib.skill.jianhui.getLastPlayer(event, player) && event.source.countCards("he") > 0;
+ },
+ content: function () {
+ trigger.source.chooseToDiscard("he", true);
+ },
+ group: "jianhui_draw",
+ subSkill: {
+ draw: {
+ trigger: { source: "damageSource" },
+ forced: true,
+ logTarget: "player",
+ filter: function (event, player) {
+ return event.player == lib.skill.jianhui.getLastPlayer(event, player);
+ },
+ content: function () {
+ player.draw();
+ },
+ },
+ },
+ },
+ huaiyuan: {
+ audio: 2,
+ trigger: {
+ player: "loseAfter",
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ filter: function (event, player) {
+ var evt = event.getl(player);
+ if (!evt || !evt.hs || !evt.hs.length) return false;
+ if (event.name == "lose") {
+ for (var i in event.gaintag_map) {
+ if (event.gaintag_map[i].includes("huaiyuanx")) return true;
+ }
+ return false;
+ }
+ return player.hasHistory("lose", function (evt) {
+ if (event != evt.getParent()) return false;
+ for (var i in evt.gaintag_map) {
+ if (evt.gaintag_map[i].includes("huaiyuanx")) return true;
+ }
+ return false;
+ });
+ },
+ forced: true,
+ locked: false,
+ content: function () {
+ "step 0";
+ var num = 0;
+ if (trigger.name == "lose") {
+ for (var i in trigger.gaintag_map) {
+ if (trigger.gaintag_map[i].includes("huaiyuanx")) num++;
+ }
+ } else
+ player.getHistory("lose", function (evt) {
+ if (trigger != evt.getParent()) return false;
+ for (var i in evt.gaintag_map) {
+ if (evt.gaintag_map[i].includes("huaiyuanx")) num++;
+ }
+ return false;
+ });
+ event.count = num;
+ "step 1";
+ event.count--;
+ player.chooseTarget(true, "请选择【怀远】的目标", "令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。").set("ai", function (target) {
+ var player = _status.event.player,
+ att = get.attitude(player, target);
+ if (att <= 0) return 0;
+ if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) att *= 2.2;
+ if (target.needsToDiscard()) att *= 1.3;
+ return att * Math.sqrt(Math.max(1, 4 - target.countCards("h")));
+ });
+ "step 2";
+ if (result.bool) {
+ var target = result.targets[0];
+ event.target = target;
+ player.line(target, "green");
+ var str = get.translation(target);
+ player
+ .chooseControl()
+ .set("choiceList", ["令" + str + "的手牌上限+1", "令" + str + "的攻击范围+1", "令" + str + "摸一张牌"])
+ .set("ai", function () {
+ var player = _status.event.player,
+ target = _status.event.getParent().target;
+ if (target.hasValueTarget({ name: "sha" }, false) && !target.hasValueTarget({ name: "sha" })) return 1;
+ if (target.needsToDiscard()) return 0;
+ return 2;
+ });
+ } else event.finish();
+ "step 3";
+ if (result.index == 2) target.draw();
+ else {
+ target.addSkill("huaiyuan_effect" + result.index);
+ target.addMark("huaiyuan_effect" + result.index, 1, false);
+ game.log(target, "的", "#g" + ["手牌上限", "攻击范围"][result.index], "+1");
+ game.delayx();
+ }
+ if (event.count > 0) event.goto(1);
+ },
+ group: ["huaiyuan_init", "huaiyuan_die"],
+ subSkill: {
+ init: {
+ audio: "huaiyuan",
+ trigger: {
+ global: "phaseBefore",
+ player: "enterGame",
+ },
+ forced: true,
+ locked: false,
+ filter: function (event, player) {
+ return (event.name != "phase" || game.phaseNumber == 0) && player.countCards("h") > 0;
+ },
+ content: function () {
+ var hs = player.getCards("h");
+ if (hs.length) player.addGaintag(hs, "huaiyuanx");
+ },
+ },
+ die: {
+ trigger: { player: "die" },
+ direct: true,
+ forceDie: true,
+ skillAnimation: true,
+ animationColor: "water",
+ filter: function (event, player) {
+ return player.hasMark("huaiyuan_effect0") || player.hasMark("huaiyuan_effect1");
+ },
+ content: function () {
+ "step 0";
+ var str = "令一名其他角色",
+ num1 = player.countMark("huaiyuan_effect0"),
+ num2 = player.countMark("huaiyuan_effect1");
+ if (num1 > 0) {
+ str += "手牌上限+";
+ str += num1;
+ if (num2 > 0) str += "且";
+ }
+ if (num2 > 0) {
+ str += "攻击范围+";
+ str += num2;
+ }
+ player
+ .chooseTarget(lib.filter.notMe, get.prompt("huaiyuan"), str)
+ .set("forceDie", true)
+ .set("ai", function (target) {
+ return get.attitude(_status.event.player, target) + 114514;
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("huaiyuan_die", target);
+ var num1 = player.countMark("huaiyuan_effect0"),
+ num2 = player.countMark("huaiyuan_effect1");
+ if (num1 > 0) {
+ target.addSkill("huaiyuan_effect0");
+ target.addMark("huaiyuan_effect0", num1, false);
+ }
+ if (num2 > 0) {
+ target.addSkill("huaiyuan_effect1");
+ target.addMark("huaiyuan_effect1", num2, false);
+ }
+ game.delayx();
+ }
+ },
+ },
+ effect0: {
+ charlotte: true,
+ onremove: true,
+ mod: {
+ maxHandcard: function (player, num) {
+ return num + player.countMark("huaiyuan_effect0");
+ },
+ },
+ marktext: "怀",
+ intro: { content: "手牌上限+#" },
+ },
+ effect1: {
+ charlotte: true,
+ onremove: true,
+ mod: {
+ attackRange: function (player, num) {
+ return num + player.countMark("huaiyuan_effect1");
+ },
+ },
+ marktext: "远",
+ intro: { content: "攻击范围+#" },
+ },
+ },
+ },
+ chongxin: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filter: function (event, player) {
+ return (
+ player.countCards("he") > 0 &&
+ game.hasPlayer(function (current) {
+ return current != player && current.countCards("h") > 0;
+ })
+ );
+ },
+ filterCard: true,
+ filterTarget: function (card, player, target) {
+ return target != player && target.countCards("h") > 0;
+ },
+ check: function (card) {
+ return 6 - get.value(card);
+ },
+ discard: false,
+ lose: false,
+ delay: false,
+ position: "he",
+ content: function () {
+ "step 0";
+ player.recast(cards);
+ "step 1";
+ if (target.countCards("he") > 0) {
+ target.chooseCard("he", true, "请重铸一张牌", lib.filter.cardRecastable);
+ } else event.finish();
+ "step 2";
+ if (result.bool) {
+ target.recast(result.cards);
+ }
+ },
+ ai: {
+ order: 6,
+ result: {
+ player: 1,
+ target: function (player, target) {
+ return 0.5 * Math.sqrt(Math.min(3, target.countCards("h")));
+ },
+ },
+ },
+ },
+ dezhang: {
+ trigger: { player: "phaseZhunbeiBegin" },
+ derivation: "weishu",
+ juexingji: true,
+ forced: true,
+ skillAnimation: true,
+ animationColor: "thunder",
+ filter: function (event, player) {
+ return !player.hasCard(function (card) {
+ return card.hasGaintag("huaiyuanx");
+ }, "h");
+ },
+ content: function () {
+ player.awakenSkill("dezhang");
+ player.loseMaxHp();
+ player.addSkills("weishu");
+ },
+ },
+ weishu: {
+ audio: 2,
+ trigger: { player: "gainAfter" },
+ forced: true,
+ filter: function (event, player) {
+ return event.getParent().name == "draw" && event.getParent(2).name != "weishu" && event.getParent("phaseDraw").player != player;
+ },
+ content: function () {
+ "step 0";
+ player.chooseTarget(true, "请选择【卫戍】的目标", "令一名角色摸一张牌").set("ai", function (target) {
+ return get.attitude(_status.event.player, target) * Math.sqrt(Math.max(1, 4 - target.countCards("h")));
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.line(target, "green");
+ target.draw();
+ }
+ },
+ group: "weishu_discard",
+ subSkill: {
+ discard: {
+ trigger: {
+ player: "loseAfter",
+ global: "loseAsyncAfter",
+ },
+ forced: true,
+ filter: function (event, player) {
+ return event.type == "discard" && event.getParent(3).name != "weishu_discard" && event.getParent("phaseDiscard").player != player && event.getl(player).cards2.length > 0 && game.hasPlayer(target => target != player && target.countDiscardableCards(player, "he") > 0);
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(true, "请选择【卫戍】的目标", "弃置一名其他角色的一张牌", function (card, player, target) {
+ return target != player && target.countDiscardableCards(player, "he") > 0;
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.effect(target, { name: "guohe_copy2" }, player, player);
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.line(target, "green");
+ player.discardPlayerCard(target, "he", true);
+ }
+ },
+ },
+ },
+ },
+ gaoling: {
+ audio: 2,
+ trigger: { player: "showCharacterAfter" },
+ hiddenSkill: true,
+ filter: function (event, player) {
+ return (
+ event.toShow.includes("xuangongzhu") &&
+ player != _status.currentPhase &&
+ game.hasPlayer(function (current) {
+ return current.isDamaged();
+ })
+ );
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("gaoling"), "令一名角色回复1点体力", function (card, player, target) {
+ return target.isDamaged();
+ })
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.recoverEffect(target, player, player);
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("gaoling", target);
+ target.recover();
+ }
+ },
+ },
+ qimei: {
+ audio: 2,
+ trigger: { player: "phaseZhunbeiBegin" },
+ direct: true,
+ preHidden: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget(get.prompt("qimei"), "选择一名其他角色并获得“齐眉”效果", lib.filter.notMe)
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ return get.attitude(player, target) / (Math.abs(player.countCards("h") + 2 - target.countCards("h")) + 1);
+ })
+ .setHiddenSkill("qimei");
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("qimei", target);
+ player.storage.qimei_draw = target;
+ player.addTempSkill("qimei_draw", { player: "phaseBegin" });
+ game.delayx();
+ }
+ },
+ subSkill: {
+ draw: {
+ audio: "qimei",
+ charlotte: true,
+ forced: true,
+ popup: false,
+ trigger: {
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "loseAfter", "addToExpansionAfter"],
+ },
+ usable: 1,
+ filter: function (event, player) {
+ var target = player.storage.qimei_draw;
+ if (!target || !target.isIn()) return false;
+ if (player.countCards("h") != target.countCards("h")) return false;
+ var hasChange = function (event, player) {
+ var gain = 0,
+ lose = 0;
+ if (event.getg) gain = event.getg(player).length;
+ if (event.getl) lose = event.getl(player).hs.length;
+ return gain != lose;
+ };
+ return hasChange(event, player) || hasChange(event, target);
+ },
+ content: function () {
+ "step 0";
+ if (trigger.delay === false) game.delayx();
+ "step 1";
+ var target = player.storage.qimei_draw;
+ player.logSkill("qimei_draw", target);
+ var drawer = [];
+ var hasChange = function (event, player) {
+ var gain = 0,
+ lose = 0;
+ if (event.getg) gain = event.getg(player).length;
+ if (event.getl) lose = event.getl(player).hs.length;
+ return gain != lose;
+ };
+ if (hasChange(trigger, player)) drawer.push(target);
+ if (hasChange(trigger, target)) drawer.push(player);
+ if (drawer.length == 1) drawer[0].draw();
+ else {
+ game.asyncDraw(drawer.sortBySeat());
+ game.delayex();
+ }
+ },
+ group: "qimei_hp",
+ onremove: true,
+ mark: "character",
+ intro: { content: "已和$组成齐眉组合" },
+ },
+ hp: {
+ audio: "qimei",
+ trigger: { global: "changeHp" },
+ charlotte: true,
+ forced: true,
+ logTarget: function (event, player) {
+ return player.storage.qimei_draw;
+ },
+ usable: 1,
+ filter: function (event, player) {
+ var target = player.storage.qimei_draw;
+ if (!target || !target.isIn()) return false;
+ if (player != event.player && target != event.player) return false;
+ return player.hp == target.hp;
+ },
+ content: function () {
+ game.delayx();
+ (player == trigger.player ? player.storage.qimei_draw : player).draw();
+ },
+ },
+ },
+ },
+ ybzhuiji: {
+ audio: 2,
+ trigger: { player: "phaseUseBegin" },
+ direct: true,
+ preHidden: true,
+ content: function () {
+ "step 0";
+ var list = ["摸两张牌,并于出牌阶段结束时失去1点体力"];
+ if (player.isDamaged()) list.push("回复1点体力,并于出牌阶段结束时弃置两张牌");
+ player
+ .chooseControl("cancel2")
+ .set("choiceList", list)
+ .set("prompt", get.prompt("ybzhuiji"))
+ .set("ai", function () {
+ var player = _status.event.player;
+ if (player.isDamaged() && player.countCards("h", "tao") < player.getDamagedHp()) return 1;
+ return "cancel2";
+ })
+ .setHiddenSkill("ybzhuiji");
+ "step 1";
+ if (result.control != "cancel2") {
+ player.logSkill("ybzhuiji");
+ if (result.index == 0) player.draw(2);
+ else player.recover();
+ player.addTempSkill("ybzhuiji_" + result.index, "phaseUseAfter");
+ }
+ },
+ subSkill: {
+ 0: {
+ trigger: { player: "phaseUseEnd" },
+ forced: true,
+ charlotte: true,
+ content: function () {
+ player.loseHp();
+ },
+ },
+ 1: {
+ trigger: { player: "phaseUseEnd" },
+ forced: true,
+ charlotte: true,
+ content: function () {
+ player.chooseToDiscard("he", 2, true);
+ },
+ },
+ },
+ },
+ canmou: {
+ audio: 2,
+ trigger: { global: "useCardToPlayer" },
+ direct: true,
+ filter: function (event, player) {
+ if (!event.player.isMaxHandcard(true) || !event.isFirstTarget || get.type(event.card, null, false) != "trick") return false;
+ var info = get.info(event.card);
+ if (info.allowMultiple == false) return false;
+ if (event.targets && !info.multitarget) {
+ if (
+ game.hasPlayer(function (current) {
+ return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, event.player, current); //&&lib.filter.targetInRange(event.card,event.player,current);
+ })
+ ) {
+ return true;
+ }
+ }
+ return false;
+ },
+ preHidden: true,
+ content: function () {
+ "step 0";
+ var prompt2 = "为" + get.translation(trigger.card) + "增加一个目标";
+ player
+ .chooseTarget(get.prompt("canmou"), function (card, player, target) {
+ var player = _status.event.source;
+ return !_status.event.targets.includes(target) && lib.filter.targetEnabled2(_status.event.card, player, target); //&&lib.filter.targetInRange(_status.event.card,player,target);
+ })
+ .set("prompt2", prompt2)
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.source;
+ return get.effect(target, trigger.card, player, _status.event.player);
+ })
+ .set("targets", trigger.targets)
+ .set("card", trigger.card)
+ .set("source", trigger.player)
+ .setHiddenSkill(event.name);
+ "step 1";
+ if (result.bool) {
+ if (!event.isMine() && !event.isOnline()) game.delayx();
+ event.targets = result.targets;
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (event.targets) {
+ player.logSkill(event.name, event.targets);
+ trigger.targets.addArray(event.targets);
+ game.log(event.targets, "也成为了", trigger.card, "的目标");
+ }
+ },
+ },
+ congjian: {
+ audio: 2,
+ trigger: { global: "useCardToTarget" },
+ logTarget: "target",
+ filter: function (event, player) {
+ return event.target != player && event.targets.length == 1 && get.type(event.card, null, false) == "trick" && event.target.isMaxHp(true) && lib.filter.targetEnabled2(event.card, event.player, player);
+ },
+ check: function (event, player) {
+ return get.effect(player, event.card, event.player, player) > 0;
+ },
+ preHidden: true,
+ content: function () {
+ trigger.targets.push(player);
+ game.log(player, "也成为了", trigger.card, "的目标");
+ var next = game.createEvent("congjian_draw", false);
+ next.player = player;
+ event.next.remove(next);
+ trigger.getParent().after.push(next);
+ next.setContent(function () {
+ if (
+ player.hasHistory("damage", function (evt) {
+ return evt.card == event.parent.card;
+ })
+ )
+ player.draw(2);
+ });
+ },
+ },
+ wanyi: {
+ audio: 2,
+ enable: "phaseUse",
+ filter: function (event, player) {
+ return (
+ player.getStorage("wanyi2").length < 4 &&
+ player.hasCard(function (i) {
+ return get.is.yingbian(i);
+ }, "hs")
+ );
+ },
+ chooseButton: {
+ dialog: function (event, player) {
+ var list = ["zhujinqiyuan", "chuqibuyi", "shuiyanqijunx", "dongzhuxianji"];
+ list.removeArray(player.getStorage("wanyi2"));
+ return ui.create.dialog("婉嫕", [list, "vcard"], "hidden");
+ },
+ filter: function (button, player) {
+ return lib.filter.filterCard({ name: button.link[2] }, player, _status.event.getParent());
+ },
+ check: function (button) {
+ return _status.event.player.getUseValue({ name: button.link[2] });
+ },
+ backup: function (links) {
+ return {
+ audio: "wanyi",
+ popname: true,
+ viewAs: {
+ name: links[0][2],
+ },
+ filterCard: function (card) {
+ return get.is.yingbian(card);
+ },
+ check: function (card) {
+ return 1 / Math.max(1, get.value(card));
+ },
+ position: "hs",
+ onuse: function (links, player) {
+ if (!player.storage.wanyi2) player.storage.wanyi2 = [];
+ player.storage.wanyi2.add(links.card.name);
+ player.addTempSkill("wanyi2");
+ },
+ };
+ },
+ prompt: function (links) {
+ return "将一张应变牌当做" + get.translation(links[0][2]) + "使用";
+ },
+ },
+ subSkill: { backup: {} },
+ ai: { order: 8, result: { player: 1 } },
+ },
+ wanyi2: { onremove: true },
+ maihuo: {
+ audio: 2,
+ trigger: { target: "useCardToTargeted" },
+ logTarget: "player",
+ filter: function (event, player) {
+ return event.card.name == "sha" && event.card.isCard && event.getParent(2).name != "maihuo_effect" && event.cards.filterInD().length > 0 && event.targets.length == 1 && event.player.isIn() && !event.player.getExpansions("maihuo_effect").length;
+ },
+ prompt2: function (event) {
+ return "令" + get.translation(event.card) + "暂时对你无效";
+ },
+ check: function (event, player) {
+ return get.effect(player, event.card, event.player, player) < 0;
+ },
+ content: function () {
+ trigger.excluded.add(player);
+ var target = trigger.player,
+ cards = trigger.cards.filterInD();
+ target.addToExpansion("gain2", cards).gaintag.add("maihuo_effect");
+ target.storage.maihuo_target = player;
+ target.addSkill("maihuo_effect");
+ },
+ group: "maihuo_damage",
+ subSkill: {
+ effect: {
+ trigger: { player: "phaseUseBegin" },
+ forced: true,
+ charlotte: true,
+ filter: function (event, player) {
+ return player.getExpansions("maihuo_effect").length > 0;
+ },
+ content: function () {
+ "step 0";
+ var cards = player.getExpansions("maihuo_effect"),
+ card = cards[0];
+ if (card.name != "sha")
+ card = get.autoViewAs(
+ {
+ name: "sha",
+ isCard: true,
+ },
+ cards
+ );
+ var target = player.storage.maihuo_target;
+ if (target.isIn() && player.canUse(card, target, null, true)) {
+ player.useCard(card, target, cards);
+ }
+ "step 1";
+ player.removeSkill("maihuo_effect");
+ },
+ marktext: "祸",
+ intro: {
+ content: "expansion",
+ markcount: "expansion",
+ },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ ai: { threaten: 1.05 },
+ },
+ damage: {
+ trigger: { source: "damageSource" },
+ forced: true,
+ locked: false,
+ filter: function (event, player) {
+ return event.player.hasSkill("maihuo_effect") && event.player.getExpansions("maihuo_effect").length > 0;
+ },
+ content: function () {
+ trigger.player.removeSkill("maihuo_effect");
+ },
+ },
+ },
+ },
+ xuanbei: {
+ audio: 2,
+ trigger: {
+ global: "phaseBefore",
+ player: "enterGame",
+ },
+ filter: function (event, player) {
+ return event.name != "phase" || game.phaseNumber == 0;
+ },
+ forced: true,
+ locked: false,
+ content: function () {
+ var cards = [];
+ while (cards.length < 2) {
+ var card = get.cardPile2(function (i) {
+ return get.is.yingbian(i) && !cards.includes(i);
+ });
+ if (!card) break;
+ else cards.push(card);
+ }
+ if (cards.length) player.gain(cards, "gain2");
+ },
+ group: "xuanbei_give",
+ subSkill: {
+ give: {
+ trigger: { player: "useCardAfter" },
+ usable: 1,
+ filter: function (event, player) {
+ return (event.card.yingbian || get.is.yingbian(event.card)) && event.cards.filterInD().length > 0;
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ event.cards = trigger.cards.filterInD();
+ player.chooseTarget(get.prompt("xuanbei"), "令一名其他角色获得" + get.translation(event.cards), lib.filter.notMe).set("ai", function (target) {
+ var att = get.attitude(_status.event.player, target);
+ if (att < 3) return 0;
+ if (target.hasJudge("lebu")) att /= 2;
+ if (target.hasSkillTag("nogain")) att /= 10;
+ return att / (1 + get.distance(player, target, "absolute"));
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.logSkill("xuanbei_give", target);
+ target.gain(cards, "gain2").giver = player;
+ } else player.storage.counttrigger.xuanbei_give--;
+ },
+ ai: { expose: 0.1 },
+ },
+ },
+ },
+ xianwan: {
+ audio: 2,
+ enable: "chooseToUse",
+ filter: function (event, player) {
+ return (
+ event.filterCard &&
+ event.filterCard(
+ {
+ name: "sha" + (player.isLinked() ? "" : "n"),
+ isCard: true,
+ },
+ player,
+ event
+ )
+ );
+ },
+ viewAs: function (cards, player) {
+ return {
+ name: "sha" + (player.isLinked() ? "" : "n"),
+ isCard: true,
+ };
+ },
+ filterCard: () => false,
+ selectCard: -1,
+ prompt: "将武将牌重置并视为使用【杀】",
+ log: false,
+ check: () => 1,
+ precontent: function () {
+ player.logSkill("xianwan");
+ player.link();
+ },
+ ai: {
+ order: 3.4,
+ respondSha: true,
+ respondShan: true,
+ skillTagFilter: function (player, tag) {
+ return tag == "respondSha" + (player.isLinked() ? "" : "n");
+ },
+ effect: {
+ target: function (card, player, target, current) {
+ if (get.tag(card, "respondShan") && current < 0 && !player.isLinked()) return 0.4;
+ },
+ },
+ },
+ },
+ recaiwang: {
+ audio: "caiwang",
+ inherit: "caiwang",
+ group: ["recaiwang_hand", "recaiwang_equip", "recaiwang_judge"],
+ },
+ recaiwang_hand: {
+ audio: "caiwang",
+ enable: ["chooseToUse", "chooseToRespond"],
+ viewAsFilter: function (player) {
+ var js = player.getCards("h");
+ return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player);
+ },
+ selectCard: -1,
+ filterCard: true,
+ position: "h",
+ prompt: "将全部手牌当做【闪】使用",
+ viewAs: { name: "shan" },
+ check: card => 10 - get.value(card),
+ ai: {
+ order: 1,
+ respondShan: true,
+ skillTagFilter: function (player) {
+ return player.countCards("h") == 1;
+ },
+ },
+ },
+ recaiwang_equip: {
+ audio: "caiwang",
+ enable: ["chooseToUse", "chooseToRespond"],
+ viewAsFilter: function (player) {
+ var js = player.getCards("e");
+ return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player);
+ },
+ selectCard: -1,
+ filterCard: true,
+ check: card => 9 - get.value(card),
+ position: "e",
+ prompt: "将装备区的牌当做【无懈可击】使用",
+ viewAs: { name: "wuxie" },
+ ai: {
+ order: 1,
+ },
+ },
+ recaiwang_judge: {
+ audio: "caiwang",
+ enable: ["chooseToUse", "chooseToRespond"],
+ viewAsFilter: function (player) {
+ var js = player.getCards("j");
+ return js.length == 1 && game.checkMod(js[0], player, "unchanged", "cardEnabled2", player);
+ },
+ selectCard: -1,
+ filterCard: true,
+ position: "j",
+ prompt: "将判定区的牌当做【杀】使用",
+ viewAs: { name: "sha" },
+ check: card => 1,
+ locked: false,
+ ai: {
+ order: 10,
+ respondSha: true,
+ skillTagFilter: function (player) {
+ return player.countCards("j") == 1;
+ },
+ effect: {
+ target: function (card, player, target, current) {
+ if (card && (card.name == "shandian" || card.name == "fulei") && player == target && !target.countCards("j") && target.isPhaseUsing() && target.hasValueTarget({ name: "sha" }, null, true)) return [1, 2];
+ },
+ },
+ },
+ mod: {
+ aiOrder: function (player, card, num) {
+ if (card.name == "shandian" || card.name == "fulei") return num + 3;
+ },
+ },
+ },
+ caozhao: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filter: function (event, player) {
+ if (
+ player.countCards("h") == 0 ||
+ !game.hasPlayer(function (current) {
+ return current != player && current.hp <= player.hp;
+ })
+ )
+ return false;
+ var list = player.getStorage("caozhao");
+ for (var i of lib.inpile) {
+ if (!list.includes(i) && ["basic", "trick"].includes(get.type(i))) return true;
+ }
+ return false;
+ },
+ chooseButton: {
+ dialog: function (event, player) {
+ var list = player.getStorage("caozhao"),
+ vcards = [];
+ for (var i of lib.inpile) {
+ if (!list.includes(i)) {
+ var type = get.type(i);
+ if (type == "basic" || type == "trick") vcards.push([type, "", i]);
+ }
+ }
+ return ui.create.dialog("草诏", [vcards, "vcard"]);
+ },
+ check: function (button) {
+ return _status.event.player.getUseValue({ name: button.link[2], isCard: true }, null, true);
+ },
+ backup: function (links, player) {
+ return {
+ audio: "caozhao",
+ cardname: links[0][2],
+ filterCard: true,
+ position: "h",
+ check: function (card) {
+ return player.getUseValue({ name: lib.skill.caozhao_backup.cardname }) - (player.getUseValue(card, null, true) + 0.1) / (get.value(card) / 6);
+ },
+ filterTarget: function (card, player, target) {
+ return target != player && target.hp <= player.hp;
+ },
+ discard: false,
+ lose: false,
+ content: function () {
+ "step 0";
+ player.showCards(cards, get.translation(player) + "发动【草诏】,声明" + get.translation(lib.skill.caozhao_backup.cardname));
+ if (!player.storage.caozhao) player.storage.caozhao = [];
+ player.storage.caozhao.push(lib.skill.caozhao_backup.cardname);
+ "step 1";
+ target
+ .chooseControl()
+ .set("choiceList", ["令" + get.translation(player) + "将" + get.translation(cards[0]) + "的牌名改为" + get.translation(lib.skill.caozhao_backup.cardname), "失去1点体力"])
+ .set("ai", function (event, player) {
+ var target = _status.event.getParent().player;
+ if (get.attitude(player, target) > 0) return 0;
+ if (player.hp > 3 || (player.hp > 1 && player.hasSkill("zhaxiang"))) return 1;
+ if (player.hp > 2) return Math.random() > 0.5 ? 0 : 1;
+ return 0;
+ });
+ "step 2";
+ if (result.index == 1) {
+ target.addExpose(0.2);
+ target.loseHp();
+ event.finish();
+ } else {
+ player.chooseTarget("是否将" + get.translation(lib.skill.caozhao_backup.cardname) + "(" + get.translation(cards[0]) + ")交给一名其他角色?", lib.filter.notMe).set("ai", () => -1);
+ }
+ "step 3";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.line(target, "green");
+ if (!target.storage.caozhao_info) target.storage.caozhao_info = {};
+ target.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname;
+ target.addSkill("caozhao_info");
+ player.give(cards, target, "give").gaintag.add("caozhao");
+ } else {
+ if (!player.storage.caozhao_info) player.storage.caozhao_info = {};
+ player.storage.caozhao_info[cards[0].cardid] = lib.skill.caozhao_backup.cardname;
+ player.addGaintag(cards, "caozhao");
+ player.addSkill("caozhao_info");
+ }
+ },
+ ai: {
+ result: {
+ player: 2,
+ target: 0.1,
+ },
+ },
+ };
+ },
+ prompt: function (links, player) {
+ return "将一张手牌声明为" + get.translation(links[0][2]);
+ },
+ },
+ ai: {
+ order: 1,
+ result: {
+ player: 1,
+ },
+ },
+ },
+ caozhao_info: {
+ charlotte: true,
+ mod: {
+ cardname: function (card, player) {
+ var map = player.storage.caozhao_info;
+ if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return map[card.cardid];
+ },
+ cardnature: function (card, player) {
+ var map = player.storage.caozhao_info;
+ if (map && map[card.cardid] && get.itemtype(card) == "card" && card.hasGaintag("caozhao")) return false;
+ },
+ },
+ },
+ olxibing: {
+ audio: 2,
+ trigger: { player: "damageEnd" },
+ filter: function (event, player) {
+ return event.player && event.source && event.player != event.source && event.player.isAlive() && event.source.isAlive() && (event.player.countCards("he") > 0 || event.source.countCards("he") > 0);
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var target = trigger.source;
+ event.target = target;
+ player
+ .chooseTarget(get.prompt("olxibing"), "弃置自己或" + get.translation(target) + "的两张牌,然后手牌数较少的角色摸两张牌且不能对你使用牌直到回合结束", function (card, player, target) {
+ if (target != player && target != _status.event.target) return false;
+ return target.countCards("he") > 0;
+ })
+ .set("target", target)
+ .set("ai", function (targetx) {
+ var player = _status.event.player,
+ target = _status.event.target;
+ if (target == targetx) {
+ if (get.attitude(player, target) > 0) return 0;
+ var cards = target
+ .getCards("he", function (card) {
+ return lib.filter.canBeDiscarded(card, player, target);
+ })
+ .sort(function (a, b) {
+ return get.buttonValue(b) - get.buttonValue(a);
+ });
+ if (
+ target.countCards("h") - player.countCards("h") >=
+ Math.max(
+ 0,
+ Math.min(2, cards.length) -
+ target.countCards("e", function (card) {
+ var index = cards.indexOf(card);
+ return index != -1 && index < 2;
+ })
+ )
+ )
+ return 1;
+ return 0;
+ }
+ var cards = player
+ .getCards("he", function (card) {
+ return lib.filter.cardDiscardable(card, player, "olxibing");
+ })
+ .sort(function (a, b) {
+ return get.useful(a) - get.useful(b);
+ });
+ if (
+ player.countCards("h") - target.countCards("h") <
+ Math.max(
+ 0,
+ Math.min(cards.length, 2) -
+ player.countCards("e", function (card) {
+ var index = cards.indexOf(card);
+ return index != -1 && index < 2;
+ })
+ ) &&
+ (cards.length < 2 || get.value(cards[1]) < 5.5)
+ )
+ return 0.8;
+ return 0;
+ });
+ "step 1";
+ if (result.bool) {
+ player.logSkill("olxibing", target);
+ var target = result.targets[0];
+ if (target == player) player.chooseToDiscard("he", 2, true);
+ else player.discardPlayerCard(target, "he", true, 2);
+ } else event.finish();
+ "step 2";
+ if (player.isIn() && target.isIn()) {
+ var hs = player.countCards("h"),
+ ts = target.countCards("h");
+ if (hs != ts) {
+ var drawer = hs > ts ? target : player;
+ drawer.draw(2);
+ player.addTempSkill("olxibing2");
+ player.markAuto("olxibing2", [drawer]);
+ }
+ }
+ },
+ },
+ olxibing2: {
+ mod: {
+ targetEnabled: function (card, player, target) {
+ if (target.getStorage("olxibing2").includes(player)) return false;
+ },
+ cardSavable: function (card, player, target) {
+ if (target.getStorage("olxibing2").includes(player)) return false;
+ },
+ },
+ onremove: true,
+ },
+ bolan: {
+ audio: 2,
+ banned: ["kotomi_chuanxiang"],
+ global: "bolan_g",
+ initList: function (player) {
+ var list,
+ skills = [];
+ if (get.mode() == "guozhan") {
+ list = [];
+ for (var i in lib.characterPack.mode_guozhan) {
+ if (lib.character[i]) list.push(i);
+ }
+ } else if (_status.connectMode) list = get.charactersOL();
+ else {
+ list = [];
+ for (var i in lib.character) {
+ if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue;
+ list.push(i);
+ }
+ }
+ for (var i of list) {
+ if (i.indexOf("gz_jun") == 0) continue;
+ for (var j of lib.character[i][3]) {
+ if (j == "bolan") continue;
+ var skill = lib.skill[j];
+ if (!skill || skill.juexingji || skill.hiddenSkill || skill.zhuSkill || skill.dutySkill || skill.chargeSkill || lib.skill.bolan.banned.includes(j)) continue;
+ if (skill.init || (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg))) continue;
+ var info = lib.translate[j + "_info"];
+ if (info && info.indexOf("出牌阶段限一次") != -1) skills.add(j);
+ }
+ }
+ player.storage.bolan = skills;
+ },
+ check: function (event, player) {
+ return true;
+ },
+ trigger: { player: "phaseUseBegin" },
+ frequent: true,
+ preHidden: true,
+ content: function () {
+ "step 0";
+ if (player.isIn()) {
+ if (!player.storage.bolan) lib.skill.bolan.initList(player);
+ var list = player.storage.bolan.randomGets(3);
+ if (!list.length) {
+ event.finish();
+ return;
+ }
+ player
+ .chooseControl(list)
+ .set(
+ "choiceList",
+ list.map(function (i) {
+ return '【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
" + get.skillInfoTranslation(i, player) + "
";
+ })
+ )
+ .set("displayIndex", false)
+ .set("prompt", "博览:请选择你要获得的技能")
+ .set("ai", () => {
+ var list = _status.event.controls.slice();
+ return list.sort((a, b) => {
+ return get.skillRank(b, "in") - get.skillRank(a, "in");
+ })[0];
+ });
+ } else event.finish();
+ "step 1";
+ player.addTempSkills(result.control, "phaseUseEnd");
+ player.popup(result.control);
+ // game.log(player,'获得了','#g【'+get.translation(result.control)+'】');
+ },
+ ai: { threaten: 0.9 },
+ subSkill: {
+ g: {
+ audio: "bolan",
+ forceaudio: true,
+ enable: "phaseUse",
+ usable: 1,
+ prompt: "出牌阶段限一次。你可以令一名有〖博览〗的角色从三个描述中包含“出牌阶段限一次”的技能中选择一个,你获得此技能直到此阶段结束。",
+ filter: function (event, player) {
+ return game.hasPlayer(function (current) {
+ return current != player && current.hasSkill("bolan");
+ });
+ },
+ filterTarget: function (card, player, target) {
+ return player != target && target.hasSkill("bolan");
+ },
+ selectTarget: function () {
+ if (
+ game.countPlayer(current => {
+ return lib.skill.bolan_g.filterTarget(null, _status.event.player, current);
+ }) == 1
+ )
+ return -1;
+ return 1;
+ },
+ content: function () {
+ "step 0";
+ player.loseHp();
+ "step 1";
+ if (target.isIn() && player.isIn()) {
+ if (!target.storage.bolan) lib.skill.bolan.initList(target);
+ var list = target.storage.bolan.randomGets(3);
+ if (!list.length) {
+ event.finish();
+ return;
+ }
+ target
+ .chooseControl(list)
+ .set(
+ "choiceList",
+ list.map(function (i) {
+ return '【' + get.translation(lib.translate[i + "_ab"] || get.translation(i).slice(0, 2)) + "】
" + get.skillInfoTranslation(i, player) + "
";
+ })
+ )
+ .set("displayIndex", false)
+ .set("prompt", "博览:请选择令" + get.translation(player) + "获得的技能")
+ .set("ai", () => {
+ var list = _status.event.controls.slice();
+ return list.sort((a, b) => {
+ return (get.skillRank(b, "in") - get.skillRank(a, "in")) * get.attitude(_status.event.player, _status.event.getParent().player);
+ })[0];
+ });
+ } else event.finish();
+ "step 2";
+ target.line(player);
+ player.addTempSkills(result.control, "phaseUseEnd");
+ player.popup(result.control);
+ },
+ ai: {
+ order: function (item, player) {
+ if (player.hp >= 5 || player.countCards("h") >= 10) return 10;
+ var list = game.filterPlayer(current => lib.skill.bolan_g.filterTarget(null, player, current));
+ for (var target of list) {
+ if (get.attitude(target, player) > 0) return 10;
+ }
+ return 4;
+ },
+ result: {
+ player: function (player, target) {
+ if (player.hasUnknown()) return player.hp + player.countCards("h") / 4 - 5 > 0 ? 1 : 0;
+ var tao = player.countCards("h", "tao");
+ if (player.hp + tao > 4) return 4 + get.attitude(player, target);
+ if (player.hp + tao > 3) return get.attitude(player, target) - 2;
+ return 0;
+ },
+ },
+ },
+ },
+ },
+ },
+ yifa: {
+ audio: 2,
+ trigger: { target: "useCardToTargeted" },
+ forced: true,
+ logTarget: "player",
+ filter: function (event, player) {
+ return player != event.player && (event.card.name == "sha" || (get.color(event.card) == "black" && get.type(event.card) == "trick"));
+ },
+ content: function () {
+ var target = trigger.player;
+ target.addTempSkill("yifa2", { player: "phaseEnd" });
+ target.addMark("yifa2", 1, false);
+ },
+ ai: { threaten: 0.8 },
+ },
+ yifa2: {
+ charlotte: true,
+ onremove: true,
+ intro: { content: "手牌上限-#" },
+ mod: {
+ maxHandcard: function (player, num) {
+ return num - player.countMark("yifa2");
+ },
+ },
+ },
+ buchen: {
+ audio: 2,
+ trigger: { player: "showCharacterAfter" },
+ hiddenSkill: true,
+ filter: function (event, player) {
+ var target = _status.currentPhase;
+ return event.toShow.includes("jin_simayi") && target && target != player && target.countGainableCards(player, "he") > 0;
+ },
+ direct: true,
+ content: function () {
+ var target = _status.currentPhase;
+ player.gainPlayerCard(target, "he", get.prompt("buchen", target)).set("logSkill", ["buchen", target]);
+ },
+ },
+ smyyingshi: {
+ audio: 2,
+ enable: "phaseUse",
+ locked: true,
+ filter: function (event, player) {
+ return Array.isArray(event.smyyingshi);
+ },
+ onChooseToUse: function (event) {
+ if (game.online || !event.player.hasSkill("smyyingshi")) return;
+ var cards = [];
+ for (var i = 0; i < event.player.maxHp; i++) {
+ var card = ui.cardPile.childNodes[i];
+ if (card) cards.push(card);
+ else break;
+ }
+ event.set("smyyingshi", cards);
+ },
+ chooseButton: {
+ dialog: function (event) {
+ var dialog = ui.create.dialog("鹰视", "hidden");
+ if (event.smyyingshi && event.smyyingshi.length) dialog.add(event.smyyingshi);
+ else dialog.addText("牌堆无牌");
+ for (var i of dialog.buttons) {
+ i.classList.add("noclick");
+ }
+ dialog.buttons.length = 0;
+ return dialog;
+ },
+ filter: function () {
+ return false;
+ },
+ },
+ },
+ xiongzhi: {
+ audio: 2,
+ enable: "phaseUse",
+ limited: true,
+ skillAnimation: true,
+ animationColor: "thunder",
+ content: function () {
+ "step 0";
+ player.awakenSkill("xiongzhi");
+ "step 1";
+ var card = get.cards()[0];
+ event.card = card;
+ player.showCards(card);
+ if (!player.hasUseTarget(card)) {
+ card.fix();
+ ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
+ game.updateRoundNumber();
+ event.finish();
+ }
+ "step 2";
+ var next = player.chooseUseTarget(card, true);
+ if (get.info(card).updateUsable == "phaseUse") next.addCount = false;
+ "step 3";
+ if (result.bool) event.goto(1);
+ else {
+ card.fix();
+ ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
+ game.updateRoundNumber();
+ }
+ },
+ ai: {
+ order: 1,
+ result: {
+ player: function (player) {
+ if (!player.hasSkill("smyyingshi")) return 1;
+ var cards = [];
+ for (var i = 0; i < Math.min(2, player.maxHp); i++) {
+ var card = ui.cardPile.childNodes[i];
+ if (card) {
+ if (!player.hasValueTarget(card)) return 0;
+ } else break;
+ }
+ return 1;
+ },
+ },
+ },
+ },
+ quanbian: {
+ audio: 2,
+ trigger: { player: ["useCard", "respond"] },
+ hasHand: function (event) {
+ var evts = event.player.getHistory("lose", function (evt) {
+ return evt.getParent() == event;
+ });
+ return evts && evts.length == 1 && evts[0].hs.length > 0;
+ },
+ filter: function (event, player) {
+ var phase = event.getParent("phaseUse");
+ if (!phase || phase.player != player) return false;
+ var suit = get.suit(event.card);
+ if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false;
+ return (
+ player.getHistory("useCard", function (evt) {
+ return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
+ }).length +
+ player.getHistory("respond", function (evt) {
+ return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
+ }).length ==
+ 0
+ );
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseControl("cancel2")
+ .set("prompt", get.prompt("quanbian"))
+ .set("choiceList", ["摸一张牌", "观看牌堆顶的" + get.cnNumber(player.maxHp) + "张牌并将其中一张置于牌堆底"])
+ .set("ai", function () {
+ var player = _status.event.player;
+ var suit = get.suit(_status.event.getTrigger().card);
+ if (
+ player.countCards("h", function (card) {
+ return get.suit(card) == suit && player.hasValueTarget(card, null, true);
+ })
+ )
+ return "cancel2";
+ return 0;
+ });
+ "step 1";
+ if (result.control == "cancel2") {
+ event.finish();
+ return;
+ }
+ player.addTempSkill("quanbian2");
+ player.storage.quanbian2.add(get.suit(trigger.card));
+ player.markSkill("quanbian2");
+ if (result.index == 0) {
+ player.draw();
+ event.finish();
+ return;
+ }
+ event.cards = get.cards(player.maxHp);
+ player.chooseButton(["将一张牌置于牌堆底", event.cards], true);
+ "step 2";
+ while (cards.length) {
+ var card = cards.pop();
+ card.fix();
+ if (card == result.links[0]) ui.cardPile.appendChild(card);
+ else ui.cardPile.insertBefore(card, ui.cardPile.firstChild);
+ }
+ game.updateRoundNumber();
+ },
+ },
+ quanbian2: {
+ init: function (player, skill) {
+ if (!player.storage[skill]) player.storage[skill] = [];
+ },
+ onremove: true,
+ mod: {
+ cardEnabled2: function (card, player) {
+ if (get.position(card) == "h" && player.storage.quanbian2.includes(get.suit(card))) return false;
+ },
+ },
+ intro: {
+ content: "本回合内不能使用$花色的手牌",
+ },
+ },
+ //卫瓘
+ zhongyun: {
+ audio: 2,
+ trigger: { player: ["damageEnd", "recoverEnd"] },
+ forced: true,
+ filter: function (event, player) {
+ return (
+ player.hp == player.countCards("h") &&
+ (player.isDamaged() ||
+ game.hasPlayer(function (current) {
+ return player.inRange(current);
+ }))
+ );
+ },
+ usable: 1,
+ preHidden: ["zhongyun2"],
+ content: function () {
+ "step 0";
+ var filterTarget = function (card, player, target) {
+ return player.inRange(target);
+ };
+ if (game.hasPlayer(current => filterTarget("L∞pers", player, current))) {
+ var bool = player.isHealthy();
+ player.chooseTarget("忠允:对攻击范围内的一名角色造成1点伤害" + (bool ? "" : ",或点取消回复1点体力"), filterTarget, bool).set("ai", function (target) {
+ var player = _status.event.player;
+ return get.damageEffect(target, player, player);
+ });
+ } else event._result = { bool: false };
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.line(target, "green");
+ target.damage();
+ } else player.recover();
+ },
+ group: "zhongyun2",
+ },
+ zhongyun2: {
+ audio: "zhongyun",
+ trigger: {
+ player: ["loseAfter"],
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ forced: true,
+ filter: function (event, player) {
+ var cards1 = event.getl(player).hs,
+ cards2 = [];
+ if (event.getg) cards2 = event.getg(player);
+ return (cards1.length > 0 || cards2.length > 0) && player.countCards("h") == player.hp;
+ },
+ usable: 1,
+ content: function () {
+ "step 0";
+ if (trigger.delay === false) game.delayx();
+ var filterTarget = function (card, player, target) {
+ return target != player && target.countDiscardableCards(player, "he") > 0;
+ };
+ if (!game.hasPlayer(current => filterTarget("L∞pers", player, current))) event._result = { bool: false };
+ else
+ player.chooseTarget(filterTarget, "忠允:弃置一名其他角色的一张牌,或点取消摸一张牌").set("ai", function (target) {
+ var att = get.attitude(player, target);
+ if (att >= 0) return 0;
+ if (
+ target.countCards("he", function (card) {
+ return get.value(card) > 5;
+ })
+ )
+ return -att;
+ return 0;
+ });
+ "step 1";
+ if (!result.bool) player.draw();
+ else {
+ var target = result.targets[0];
+ player.line(target, "green");
+ player.discardPlayerCard(target, true, "he");
+ }
+ },
+ },
+ shenpin: {
+ audio: 2,
+ trigger: { global: "judge" },
+ filter: function (event, player) {
+ var color = get.color(event.player.judging[0], event.player);
+ return (
+ player.countCards("hes", function (card) {
+ if (_status.connectMode && get.position(card) != "e") return true;
+ return get.color(card) != color;
+ }) > 0
+ );
+ },
+ direct: true,
+ preHidden: true,
+ content: function () {
+ "step 0";
+ var color = get.color(trigger.player.judging[0], trigger.player);
+ player
+ .chooseCard(get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("shenpin"), "hes", function (card) {
+ if (get.color(card) == _status.event.color) return false;
+ var player = _status.event.player;
+ var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player);
+ if (mod2 != "unchanged") return mod2;
+ var mod = game.checkMod(card, player, "unchanged", "cardRespondable", player);
+ if (mod != "unchanged") return mod;
+ return true;
+ })
+ .set("ai", function (card) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ var judging = _status.event.judging;
+ var result = trigger.judge(card) - trigger.judge(judging);
+ var attitude = get.attitude(player, trigger.player);
+ if (attitude == 0 || result == 0) return 0;
+ if (attitude > 0) {
+ return result;
+ } else {
+ return -result;
+ }
+ })
+ .set("judging", trigger.player.judging[0])
+ .set("color", color)
+ .setHiddenSkill(event.name);
+ "step 1";
+ if (result.bool) {
+ player.respond(result.cards, "highlight", "shenpin", "noOrdering");
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool) {
+ if (trigger.player.judging[0].clone) {
+ trigger.player.judging[0].clone.classList.remove("thrownhighlight");
+ game.broadcast(function (card) {
+ if (card.clone) {
+ card.clone.classList.remove("thrownhighlight");
+ }
+ }, trigger.player.judging[0]);
+ game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone]));
+ }
+ game.cardsDiscard(trigger.player.judging[0]);
+ trigger.player.judging[0] = result.cards[0];
+ trigger.orderingCards.addArray(result.cards);
+ game.log(trigger.player, "的判定牌改为", result.cards[0]);
+ game.delay(2);
+ }
+ },
+ ai: {
+ rejudge: true,
+ tag: {
+ rejudge: 1,
+ },
+ },
+ },
+ //彻里吉
+ chexuan: {
+ audio: 2,
+ enable: "phaseUse",
+ derivation: ["cheliji_sichengliangyu", "cheliji_tiejixuanyu", "cheliji_feilunzhanyu"],
+ filter: function (event, player) {
+ return !player.getEquips(5).length && player.countCards("he", { color: "black" }) > 0;
+ },
+ filterCard: { color: "black" },
+ position: "he",
+ check: function (card) {
+ return 5 - get.value(card);
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseButton(
+ [
+ "请选择要装备的宝物",
+ [
+ lib.skill.chexuan.derivation.map(function (i) {
+ return ["宝物", "", i];
+ }),
+ "vcard",
+ ],
+ ],
+ true
+ )
+ .set("ai", function (button) {
+ if (button.link[2] == "cheliji_sichengliangyu" && player.countCards("h") < player.hp) return 1;
+ return Math.random();
+ });
+ "step 1";
+ var name = result.links[0][2],
+ card = game.createCard(name, lib.card[name].cardcolor, 5);
+ player.$gain2(card);
+ player.equip(card);
+ game.delay();
+ },
+ group: "chexuan_lose",
+ subfrequent: ["lose"],
+ ai: {
+ order: 6,
+ result: {
+ player: 1,
+ },
+ },
+ subSkill: {
+ lose: {
+ audio: "chexuan",
+ trigger: {
+ player: "loseAfter",
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ frequent: true,
+ filter: function (event, player) {
+ var evt = event.getl(player);
+ if (!evt || !evt.es || !evt.es.length) return false;
+ if (event.name == "equip" && event.player == player) return false;
+ for (var i of evt.es) {
+ if (get.subtype(i, false) == "equip5") return true;
+ }
+ return false;
+ },
+ content: function () {
+ "step 0";
+ player.judge(function (card) {
+ if (get.color(card) == "black") return 3;
+ return 0;
+ });
+ "step 1";
+ if (result.bool) {
+ var card = game.createCard(lib.skill.chexuan.derivation.randomGet());
+ player.$gain2(card);
+ player.equip(card);
+ game.delay();
+ }
+ },
+ },
+ },
+ },
+ qiangshou: {
+ mod: {
+ globalFrom: function (player, target, distance) {
+ if (player.getEquips(5).length) return distance - 1;
+ },
+ },
+ },
+ cheliji_sichengliangyu: {
+ trigger: { global: "phaseJieshuBegin" },
+ equipSkill: true,
+ cardcolor: "heart",
+ filter: function (event, player) {
+ return player.countCards("h") < player.hp && player.getEquip("cheliji_sichengliangyu");
+ },
+ content: function () {
+ "step 0";
+ player.draw(2);
+ "step 1";
+ var card = player.getEquip("cheliji_sichengliangyu");
+ if (card) player.discard(card);
+ },
+ },
+ cheliji_tiejixuanyu: {
+ trigger: { global: "phaseJieshuBegin" },
+ equipSkill: true,
+ cardcolor: "club",
+ filter: function (event, player) {
+ return player != event.player && !event.player.getHistory("sourceDamage").length && event.player.countCards("he") > 0 && player.getEquip("cheliji_tiejixuanyu");
+ },
+ logTarget: "player",
+ check: function (event, player) {
+ return get.attitude(player, event.player) < 0;
+ },
+ content: function () {
+ "step 0";
+ trigger.player.chooseToDiscard("he", 2, true);
+ "step 1";
+ var card = player.getEquip("cheliji_tiejixuanyu");
+ if (card) player.discard(card);
+ },
+ },
+ cheliji_feilunzhanyu: {
+ trigger: { global: "phaseJieshuBegin" },
+ equipSkill: true,
+ cardcolor: "spade",
+ filter: function (event, player) {
+ return (
+ player != event.player &&
+ event.player.getHistory("useCard", function (card) {
+ return get.type(card.card) != "basic";
+ }).length > 0 &&
+ event.player.countCards("he") > 0 &&
+ player.getEquip("cheliji_feilunzhanyu")
+ );
+ },
+ logTarget: "player",
+ check: function (event, player) {
+ return get.attitude(player, event.player) <= 0;
+ },
+ content: function () {
+ "step 0";
+ trigger.player.chooseCard("he", true, "将一张牌交给" + get.translation(player));
+ "step 1";
+ if (result.bool) trigger.player.give(result.cards, player);
+ "step 2";
+ var card = player.getEquip("cheliji_feilunzhanyu");
+ if (card) player.discard(card);
+ },
+ },
+ //司马伷和黄祖
+ caiwang: {
+ audio: 2,
+ trigger: { global: ["useCard", "respond"] },
+ preHidden: true,
+ filter: function (event, player) {
+ if (!Array.isArray(event.respondTo) || event.respondTo[0] == event.player || ![event.respondTo[0], event.player].includes(player)) return false;
+ var color = get.color(event.card);
+ if (color == "none" || get.color(event.respondTo[1]) != color) return false;
+ var target = lib.skill.caiwang.logTarget(event, player);
+ return target[player.getStorage("naxiang2").includes(target) ? "countGainableCards" : "countDiscardableCards"](player, "he") > 0;
+ },
+ logTarget: function (event, player) {
+ return player == event.respondTo[0] ? event.player : event.respondTo[0];
+ },
+ prompt2: function (event, player) {
+ var target = lib.skill.caiwang.logTarget(event, player);
+ return (player.getStorage("naxiang2").includes(target) ? "获得" : "弃置") + "该角色的一张牌";
+ },
+ check: function (event, player) {
+ return get.attitude(player, lib.skill.caiwang.logTarget(event, player)) <= 0;
+ },
+ popup: false,
+ content: function () {
+ "step 0";
+ if (player != game.me && !player.isOnline()) game.delayx();
+ "step 1";
+ var target = lib.skill.caiwang.logTarget(trigger, player);
+ player.logSkill(event.name, target);
+ player[player.getStorage("naxiang2").includes(target) ? "gainPlayerCard" : "discardPlayerCard"](target, "he", true);
+ },
+ },
+ naxiang: {
+ audio: 2,
+ trigger: {
+ player: "damageEnd",
+ source: "damageSource",
+ },
+ forced: true,
+ preHidden: true,
+ filter: function (event, player) {
+ var target = lib.skill.naxiang.logTarget(event, player);
+ return target && target != player && target.isAlive();
+ },
+ logTarget: function (event, player) {
+ return player == event.player ? event.source : event.player;
+ },
+ content: function () {
+ player.addTempSkill("naxiang2", { player: "phaseBegin" });
+ if (!player.storage.naxiang2) player.storage.naxiang2 = [];
+ player.storage.naxiang2.add(lib.skill.naxiang.logTarget(trigger, player));
+ player.markSkill("naxiang2");
+ },
+ ai: {
+ combo: "caiwang",
+ },
+ },
+ naxiang2: {
+ onremove: true,
+ intro: {
+ content: "已接受$的投降;对这些角色发动【才望】时将“弃置”改为“获得”",
+ },
+ },
+ //李肃
+ qiaoyan: {
+ trigger: { player: "damageBegin2" },
+ forced: true,
+ filter: function (event, player) {
+ return player != _status.currentPhase && event.source && event.source != player;
+ },
+ logTarget: "source",
+ content: function () {
+ "step 0";
+ var cards = player.getExpansions("qiaoyan");
+ if (cards.length) {
+ var source = trigger.source;
+ source.gain(cards, player, "give", "bySelf");
+ event.finish();
+ } else {
+ trigger.cancel();
+ player.draw();
+ }
+ "step 1";
+ var hs = player.getCards("he");
+ if (!hs.length) event.finish();
+ else if (hs.length == 1) event._result = { bool: true, cards: hs };
+ else player.chooseCard("he", true, "将一张牌作为“珠”置于武将牌上");
+ "step 2";
+ if (result.bool && result.cards && result.cards.length) {
+ var cards = result.cards;
+ player.addToExpansion(cards, player, "give").gaintag.add("qiaoyan");
+ }
+ event.finish();
+ },
+ marktext: "珠",
+ intro: { content: "expansion", markcount: "expansion" },
+ onremove: function (player, skill) {
+ var cards = player.getExpansions(skill);
+ if (cards.length) player.loseToDiscardpile(cards);
+ },
+ ai: {
+ filterDamage: true,
+ skillTagFilter: function (player, tag, arg) {
+ if (!player.getExpansions("qiaoyan").length) return false;
+ if (arg && arg.player) {
+ if (arg.player.hasSkillTag("jueqing", false, player)) return false;
+ }
+ },
+ },
+ },
+ xianzhu: {
+ trigger: { player: "phaseUseBegin" },
+ locked: true,
+ filter: function (event, player) {
+ return player.getExpansions("qiaoyan").length > 0;
+ },
+ async cost(event, trigger, player) {
+ event.cards = player.getExpansions("qiaoyan");
+ event.result = await player
+ .chooseTarget(true, "请选择【献珠】的目标", "将" + get.translation(event.cards) + "交给一名角色。若该角色不为你自己,则你令其视为对其攻击范围内的另一名角色使用【杀】")
+ .set("ai", function (target) {
+ var player = _status.event.player;
+ var eff = get.sgn(get.attitude(player, target)) * get.value(_status.event.getParent().cards[0], target);
+ if (player != target)
+ eff += Math.max.apply(
+ null,
+ game
+ .filterPlayer(function (current) {
+ if (current != target && player.inRange(current) && target.canUse("sha", current, false)) return true;
+ })
+ .map(function (current) {
+ return get.effect(current, { name: "sha" }, target, player);
+ })
+ );
+ return eff;
+ })
+ .forResult();
+ },
+ content: function () {
+ "step 0";
+ event.cards = player.getExpansions("qiaoyan");
+ event.target = targets[0];
+ "step 1";
+ player.give(cards, target, "give");
+ "step 2";
+ if (
+ player != target &&
+ target.isIn() &&
+ player.isIn() &&
+ game.hasPlayer(function (current) {
+ return current != target && player.inRange(current) && target.canUse("sha", current, false);
+ })
+ ) {
+ var str = get.translation(target);
+ player
+ .chooseTarget(true, "选择攻击范围内的一名角色,视为" + str + "对其使用【杀】", function (card, player, target) {
+ var source = _status.event.target;
+ return player.inRange(target) && source.canUse("sha", target, false);
+ })
+ .set("target", target)
+ .set("ai", function (target) {
+ var evt = _status.event;
+ return get.effect(target, { name: "sha" }, evt.target, evt.player);
+ });
+ } else event.finish();
+ "step 3";
+ if (result.bool) target.useCard({ name: "sha", isCard: true }, result.targets[0], false);
+ },
+ ai: { combo: "qiaoyan" },
+ },
+ huirong: {
+ trigger: { player: "showCharacterAfter" },
+ forced: true,
+ filter: function (event, player) {
+ return (
+ event.toShow &&
+ event.toShow.includes("jin_yanghuiyu") &&
+ game.hasPlayer(function (target) {
+ var num = target.countCards("h");
+ return num > target.hp || num < Math.min(5, target.hp);
+ })
+ );
+ },
+ hiddenSkill: true,
+ content: function () {
+ "step 0";
+ player
+ .chooseTarget("请选择【慧容】的目标", "令一名角色将手牌数摸至/弃置至与其体力值相同(至多摸至五张)", true, function (card, player, target) {
+ var num = target.countCards("h");
+ return num > target.hp || num < Math.min(5, target.hp);
+ })
+ .set("ai", function (target) {
+ var att = get.attitude(_status.event.player, target);
+ var num = target.countCards("h");
+ if (num > target.hp) return -att * (num - target.hp);
+ return att * Math.max(0, Math.min(5, target.hp) - target.countCards("h"));
+ });
+ "step 1";
+ if (result.bool) {
+ var target = result.targets[0];
+ player.line(target, "green");
+ if (target.countCards("h") < target.hp) target.drawTo(Math.min(5, target.hp));
+ else target.chooseToDiscard("h", true, target.countCards("h") - target.hp);
+ }
+ },
+ },
+ ciwei: {
+ init: () => {
+ game.addGlobalSkill("ciwei_ai");
+ },
+ onremove: () => {
+ if (!game.hasPlayer(i => i.hasSkill("ciwei"), true)) game.removeGlobalSkill("ciwei_ai");
+ },
+ trigger: { global: "useCard" },
+ direct: true,
+ preHidden: true,
+ filter: function (event, player) {
+ if (event.all_excluded || event.player == player || event.player != _status.currentPhase || !player.countCards("he")) return false;
+ return event.player.getHistory("useCard").indexOf(event) == 1 && ["basic", "trick"].includes(get.type(event.card));
+ },
+ content: function () {
+ "step 0";
+ if (player != game.me && !player.isOnline()) game.delayx();
+ player
+ .chooseToDiscard(get.prompt("ciwei", trigger.player), "弃置一张牌,取消" + get.translation(trigger.card) + "的所有目标", "he")
+ .set("ai", function (card) {
+ return _status.event.goon / 1.4 - get.value(card);
+ })
+ .set(
+ "goon",
+ (function () {
+ if (!trigger.targets.length) return -get.attitude(player, trigger.player);
+ var num = 0;
+ for (var i of trigger.targets) {
+ num -= get.effect(i, trigger.card, trigger.player, player);
+ }
+ return num;
+ })()
+ )
+ .setHiddenSkill(event.name).logSkill = ["ciwei", trigger.player];
+ "step 1";
+ if (result.bool) {
+ trigger.targets.length = 0;
+ trigger.all_excluded = true;
+ }
+ },
+ },
+ ciwei_ai: {
+ mod: {
+ aiOrder: function (player, card, num) {
+ if (
+ player != _status.currentPhase ||
+ player.getHistory("useCard").length > 1 ||
+ !game.hasPlayer(function (current) {
+ return current != player && (get.realAttitude || get.attitude)(current, player) < 0 && current.hasSkill("ciwei") && current.countCards("he") > 0;
+ })
+ )
+ return;
+ if (player.getHistory("useCard").length == 0) {
+ if (["basic", "trick"].includes(get.type(card))) return num + 10;
+ return;
+ }
+ if (!["basic", "trick"].includes(get.type(card))) return num + 10;
+ if (!player._ciwei_temp) {
+ player._ciwei_temp = true;
+ num /= Math.max(1, player.getUseValue(card));
+ }
+ delete player._ciwei_temp;
+ return num;
+ },
+ },
+ trigger: { player: "dieAfter" },
+ filter: () => {
+ return !game.hasPlayer(i => i.hasSkill("ciwei"), true);
+ },
+ silent: true,
+ forceDie: true,
+ content: () => {
+ game.removeGlobalSkill("ciwei_ai");
+ },
+ },
+ caiyuan: {
+ trigger: { player: "phaseEnd" },
+ forced: true,
+ preHidden: true,
+ filter: function (event, player) {
+ if (player.phaseNumber <= 1) return false;
+ const history1 = _status.globalHistory,
+ history2 = player.actionHistory;
+ for (let i = 0; i < Math.min(history1.length, history2.length); i++) {
+ let i1 = history1.length - 1 - i,
+ i2 = history2.length - 1 - i;
+ if (i > 0 && history2[i2].isMe) break;
+ if (history1[i1].changeHp.some(evt => evt.player == player && evt.num < 0)) return false;
+ }
+ return true;
+ },
+ content: function () {
+ player.draw(2);
+ },
+ },
+ zhuosheng: {
+ audio: 2,
+ locked: false,
+ init: function (player) {
+ player.addSkill("zhuosheng_count");
+ if (game.phaseNumber > 0) {
+ var hs = player.getCards("h"),
+ all = player.getAllHistory(),
+ cards = [];
+ for (var i = all.length - 1; i >= 0; i--) {
+ for (var j of all[i].gain) {
+ cards.addArray(j.cards);
+ }
+ if (all[i].isRound) break;
+ }
+ cards = cards.filter(function (i) {
+ return hs.includes(i);
+ });
+ if (cards.length) player.addGaintag(cards, "zhuosheng");
+ }
+ },
+ onremove: function (player) {
+ player.removeSkill("zhuosheng_count");
+ player.removeGaintag("zhuosheng");
+ },
+ mod: {
+ targetInRange: function (card, player, target) {
+ if (!card.cards || get.type(card) != "basic") return;
+ for (var i of card.cards) {
+ if (i.hasGaintag("zhuosheng")) return game.online ? player == _status.currentPhase : player.isPhaseUsing();
+ }
+ },
+ cardUsable: function (card, player, target) {
+ if (!card.cards || get.mode() == "guozhan" || get.type(card) != "basic" || !(game.online ? player == _status.currentPhase : player.isPhaseUsing())) return;
+ for (var i of card.cards) {
+ if (i.hasGaintag("zhuosheng")) return Infinity;
+ }
+ },
+ aiOrder: function (player, card, num) {
+ if (get.itemtype(card) == "card" && card.hasGaintag("zhuosheng") && get.type(card) == "basic") return num - 0.1;
+ },
+ },
+ trigger: { player: "useCard2" },
+ direct: true,
+ filterx: function (event, player) {
+ if (!player.isPhaseUsing()) return false;
+ return (
+ player.getHistory("lose", function (evt) {
+ if (evt.getParent() != event) return false;
+ for (var i in evt.gaintag_map) {
+ if (evt.gaintag_map[i].includes("zhuosheng")) return true;
+ }
+ return false;
+ }).length > 0
+ );
+ },
+ filter: function (event, player) {
+ if (!lib.skill.zhuosheng.filterx(event, player)) return false;
+ if (get.type(event.card) != "trick") return false;
+ if (event.targets && event.targets.length > 0) return true;
+ var info = get.info(event.card);
+ if (info.allowMultiple == false) return false;
+ if (event.targets && !info.multitarget) {
+ if (
+ game.hasPlayer(function (current) {
+ return !event.targets.includes(current) && lib.filter.targetEnabled2(event.card, player, current) && lib.filter.targetInRange(event.card, player, current);
+ })
+ ) {
+ return true;
+ }
+ }
+ return false;
+ },
+ content: function () {
+ "step 0";
+ var prompt2 = "为" + get.translation(trigger.card) + "增加或减少一个目标";
+ player
+ .chooseTarget(get.prompt("zhuosheng"), function (card, player, target) {
+ var player = _status.event.player;
+ if (_status.event.targets.includes(target)) return true;
+ return lib.filter.targetEnabled2(_status.event.card, player, target) && lib.filter.targetInRange(_status.event.card, player, target);
+ })
+ .set("prompt2", prompt2)
+ .set("ai", function (target) {
+ var trigger = _status.event.getTrigger();
+ var player = _status.event.player;
+ return get.effect(target, trigger.card, player, player) * (_status.event.targets.includes(target) ? -1 : 1);
+ })
+ .set("targets", trigger.targets)
+ .set("card", trigger.card);
+ "step 1";
+ if (result.bool) {
+ if (!event.isMine() && !event.isOnline()) game.delayx();
+ event.targets = result.targets;
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (event.targets) {
+ player.logSkill("zhuosheng", event.targets);
+ if (trigger.targets.includes(event.targets[0])) trigger.targets.removeArray(event.targets);
+ else trigger.targets.addArray(event.targets);
+ }
+ },
+ group: ["zhuosheng_equip", "zhuosheng_silent"],
+ subfrequent: ["equip"],
+ subSkill: {
+ equip: {
+ audio: "zhuosheng",
+ trigger: { player: "useCard" },
+ filter: function (event, player) {
+ return get.type(event.card) == "equip" && lib.skill.zhuosheng.filterx(event, player);
+ },
+ frequent: true,
+ prompt: "是否发动【擢升】摸一张牌?",
+ content: function () {
+ player.draw();
+ },
+ },
+ silent: {
+ trigger: {
+ player: "useCard1",
+ },
+ silent: true,
+ firstDo: true,
+ filter: function (event, player) {
+ return get.mode() != "guozhan" && get.type(event.card) == "basic" && lib.skill.zhuosheng.filterx(event, player) && event.addCount !== false;
+ },
+ content: function () {
+ trigger.addCount = false;
+ var stat = player.getStat();
+ if (stat && stat.card && stat.card[trigger.card.name]) stat.card[trigger.card.name]--;
+ },
+ },
+ },
+ },
+ zhuosheng_count: {
+ trigger: {
+ player: "gainBegin",
+ global: "roundStart",
+ },
+ silent: true,
+ filter: function (event, player) {
+ if (event.name == "gain") return event.getParent(2).name != "zhuosheng_equip";
+ return game.roundNumber > 1;
+ },
+ content: function () {
+ if (trigger.name == "gain") trigger.gaintag.add("zhuosheng");
+ else player.removeGaintag("zhuosheng");
+ },
+ },
+ xinquanbian: {
+ audio: "quanbian",
+ preHidden: true,
+ trigger: { player: ["useCard", "respond"] },
+ filter: function (event, player) {
+ var phase = event.getParent("phaseUse");
+ if (!phase || phase.player != player) return false;
+ var suit = get.suit(event.card);
+ if (!lib.suit.includes(suit) || !lib.skill.quanbian.hasHand(event)) return false;
+ return (
+ player.getHistory("useCard", function (evt) {
+ return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
+ }).length +
+ player.getHistory("respond", function (evt) {
+ return evt != event && get.suit(evt.card) == suit && lib.skill.quanbian.hasHand(evt) && evt.getParent("phaseUse") == phase;
+ }).length ==
+ 0
+ );
+ },
+ content: function () {
+ "step 0";
+ var cards = get.cards(Math.min(5, player.maxHp));
+ game.cardsGotoOrdering(cards);
+ var suit = get.suit(trigger.card);
+ var next = player.chooseToMove("权变:获得一张不为" + get.translation(suit) + "花色的牌并排列其他牌");
+ next.set("suit", suit);
+ next.set("list", [["牌堆顶", cards], ["获得"]]);
+ next.set("filterMove", function (from, to, moved) {
+ var suit = _status.event.suit;
+ if (moved[0].includes(from.link)) {
+ if (typeof to == "number") {
+ if (to == 1) {
+ if (moved[1].length) return false;
+ return get.suit(from.link, false) != suit;
+ }
+ return true;
+ }
+ if (moved[1].includes(to.link)) return get.suit(from.link, false) != suit;
+ return true;
+ } else {
+ if (typeof to == "number") return true;
+ return get.suit(to.link, false) != suit;
+ }
+ });
+ next.set("processAI", function (list) {
+ var cards = list[0][1].slice(0).sort(function (a, b) {
+ return get.value(b) - get.value(a);
+ }),
+ gains = [];
+ for (var i of cards) {
+ if (get.suit(i, false) != _status.event.suit) {
+ cards.remove(i);
+ gains.push(i);
+ break;
+ }
+ }
+ return [cards, gains];
+ });
+ "step 1";
+ if (result.bool) {
+ var list = result.moved;
+ if (list[1].length) player.gain(list[1], "gain2");
+ while (list[0].length) {
+ ui.cardPile.insertBefore(list[0].pop(), ui.cardPile.firstChild);
+ }
+ game.updateRoundNumber();
+ }
+ },
+ //group:'xinquanbian_count',
+ init: (player, skill) => player.addSkill("xinquanbian_count"),
+ onremove: (player, skill) => player.removeSkill("xinquanbian_count"),
+ },
+ xinquanbian_count: {
+ trigger: {
+ player: ["useCard0", "phaseUseBefore", "phaseUseAfter"],
+ },
+ silent: true,
+ firstDo: true,
+ charlotte: true,
+ filter: function (event, player) {
+ if (event.name === "phaseUse") return true;
+ return player.isPhaseUsing() && lib.skill.quanbian.hasHand(event) && get.type(event.card) != "equip";
+ },
+ content: function () {
+ var stat = player.getStat("skill");
+ if (this.trigger.name === "phaseUse") {
+ delete stat.xinquanbian;
+ } else {
+ if (!stat.xinquanbian) stat.xinquanbian = 0;
+ stat.xinquanbian++;
+ }
+ },
+ mod: {
+ cardEnabled2: function (card, player) {
+ var stat = player.getStat("skill");
+ if (stat.xinquanbian && stat.xinquanbian >= player.maxHp && get.position(card) == "h" && get.type(card, player) != "equip") return false;
+ },
+ },
+ },
+ taoyin: {
+ audio: 2,
+ trigger: { player: "showCharacterAfter" },
+ hiddenSkill: true,
+ logTarget: function () {
+ return _status.currentPhase;
+ },
+ filter: function (event, player) {
+ var target = _status.currentPhase;
+ return target && target != player && target.isAlive();
+ },
+ check: function (event, player) {
+ return get.attitude(player, _status.currentPhase) < 0;
+ },
+ content: function () {
+ _status.currentPhase.addTempSkill("taoyin2");
+ _status.currentPhase.addMark("taoyin2", 2, false);
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ taoyin2: {
+ onremove: true,
+ charlotte: true,
+ intro: {
+ content: "手牌上限-#",
+ },
+ mod: {
+ maxHandcard: function (player, num) {
+ return num - player.countMark("taoyin2");
+ },
+ },
+ },
+ yimie: {
+ audio: 2,
+ usable: 1,
+ preHidden: true,
+ trigger: { source: "damageBegin1" },
+ filter: function (event, player) {
+ return player != event.player && event.num < event.player.hp;
+ },
+ check: function (event, player) {
+ if (event.player.hasSkillTag("nodamage")) return false;
+ let tj = player.countCards("hs", function (card) {
+ return get.name(card) === "tao" || get.name(card) === "jiu";
+ }),
+ att = get.attitude(_status.event.player, event.player),
+ eff = get.damageEffect(event.player, player, _status.event.player, get.natureList(event)),
+ fd = event.player.hasSkillTag("filterDamage", null, {
+ player: player,
+ card: event.card,
+ }),
+ hp = player.hp + tj;
+ if (player.storage.tairan2) hp -= player.storage.tairan2;
+ if (eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false;
+ if (hp > 2 || (eff > 0 && event.player.isLinked() && event.hasNature())) return true;
+ return !event.player.countCards("hs") || (event.player.hp > 2 * event.num && !event.player.hasSkillTag("maixie"));
+ },
+ logTarget: "player",
+ content: function () {
+ player.loseHp();
+ trigger.player.addTempSkill("yimie2");
+ trigger.yimie_num = trigger.player.hp - trigger.num;
+ trigger.num = trigger.player.hp;
+ },
+ ai: {
+ damageBonus: true,
+ skillTagFilter: function (player, tag, arg) {
+ return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2;
+ },
+ },
+ },
+ yimie2: {
+ trigger: { player: "damageEnd" },
+ forced: true,
+ popup: false,
+ charlotte: true,
+ filter: function (event, player) {
+ return typeof event.yimie_num == "number";
+ },
+ content: function () {
+ player.recover(trigger.yimie_num);
+ },
+ },
+ ruilve: {
+ unique: true,
+ audio: 2,
+ global: "ruilve2",
+ zhuSkill: true,
+ },
+ ruilve2: {
+ enable: "phaseUse",
+ discard: false,
+ lose: false,
+ delay: false,
+ line: true,
+ log: false,
+ prepare: function (cards, player, targets) {
+ targets[0].logSkill("ruilve");
+ },
+ prompt: function () {
+ var player = _status.event.player;
+ var list = game.filterPlayer(function (target) {
+ return target != player && target.hasZhuSkill("ruilve", player);
+ });
+ var str = "将一张具有伤害标签的基本牌或锦囊牌交给" + get.translation(list);
+ if (list.length > 1) str += "中的一人";
+ return str;
+ },
+ filter: function (event, player) {
+ if (player.group != "jin") return false;
+ if (player.countCards("h", lib.skill.ruilve2.filterCard) == 0) return false;
+ return game.hasPlayer(function (target) {
+ return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3");
+ });
+ },
+ filterCard: function (card) {
+ if (!get.tag(card, "damage")) return false;
+ var type = get.type(card);
+ return type == "basic" || type == "trick";
+ },
+ visible: true,
+ filterTarget: function (card, player, target) {
+ return target != player && target.hasZhuSkill("ruilve", player) && !target.hasSkill("ruilve3");
+ },
+ content: function () {
+ player.give(cards, target);
+ target.addTempSkill("ruilve3", "phaseUseEnd");
+ },
+ ai: {
+ expose: 0.3,
+ order: 1,
+ result: {
+ target: 5,
+ },
+ },
+ },
+ ruilve3: {},
+ tairan: {
+ audio: 2,
+ trigger: { player: "phaseEnd" },
+ forced: true,
+ preHidden: true,
+ filter: function (event, player) {
+ return player.hp < player.maxHp || player.countCards("h") < player.maxHp;
+ },
+ content: function () {
+ "step 0";
+ player.addSkill("tairan2");
+ if (!player.storage.tairan2) player.storage.tairan2 = 0;
+ var num = player.maxHp - player.hp;
+ if (num > 0) {
+ player.storage.tairan2 = num;
+ player.recover(num);
+ }
+ "step 1";
+ if (player.countCards("h") < player.maxHp) player.drawTo(Math.min(player.maxHp, 5 + player.countCards("h"))).gaintag = ["tairan"];
+ },
+ },
+ tairan2: {
+ mod: {
+ aiOrder: function (player, card, num) {
+ if (card.hasGaintag && card.hasGaintag("tairan")) return 10 * num;
+ },
+ aiValue: function (player, card, num) {
+ if (card.hasGaintag && card.hasGaintag("tairan")) {
+ if (card.name !== "wuxie" && (get.type(card) === "basic" || get.type(card, "trick") === "trick")) return num / 64;
+ return num / 8;
+ }
+ },
+ aiUseful: function (player, card, num) {
+ return lib.skill.tairan2.mod.aiValue.apply(this, arguments);
+ },
+ },
+ audio: "tairan",
+ trigger: { player: "phaseUseBegin" },
+ charlotte: true,
+ forced: true,
+ onremove: true,
+ content: function () {
+ var map = player.storage.tairan2;
+ if (map > 0) player.loseHp(map);
+ var hs = player.getCards("h", function (card) {
+ return card.hasGaintag("tairan");
+ });
+ if (hs.length) player.discard(hs);
+ player.removeSkill("tairan2");
+ },
+ },
+ baoqie: {
+ audio: 2,
+ trigger: { player: "showCharacterAfter" },
+ forced: true,
+ hiddenSkill: true,
+ filter: function (event, player) {
+ return event.toShow && event.toShow.includes("jin_xiahouhui");
+ },
+ content: function () {
+ "step 0";
+ var card = get.cardPile(function (card) {
+ return get.subtype(card, false) == "equip5" && !get.cardtag(card, "gifts");
+ });
+ if (!card) {
+ event.finish();
+ return;
+ }
+ event.card = card;
+ player.gain(card, "gain2");
+ "step 1";
+ if (player.getCards("h").includes(card) && get.subtype(card) == "equip5") player.chooseUseTarget(card).nopopup = true;
+ },
+ },
+ jyishi: {
+ audio: 2,
+ trigger: {
+ global: ["loseAfter", "loseAsyncAfter"],
+ },
+ usable: 1,
+ direct: true,
+ preHidden: true,
+ filter: function (event, player) {
+ var target = _status.currentPhase;
+ if (!target || !target.isIn() || event.type != "discard" || !target.isPhaseUsing()) return false;
+ if (target == player) return false;
+ var evt = event.getl(target);
+ for (var i of evt.hs) {
+ if (get.position(i, true) == "d") return true;
+ }
+ return false;
+ },
+ content: function () {
+ "step 0";
+ event.target = _status.currentPhase;
+ event.cards = trigger.getl(event.target).hs.filterInD("d");
+ var str = "是否发动【宜室】令" + get.translation(event.target) + "获得一张牌";
+ if (event.cards.length > 1) str += ",然后获得其余的牌";
+ str += "?";
+ player
+ .chooseButton([str, event.cards])
+ .set("ai", function (button) {
+ var card = button.link;
+ var source = _status.event.source;
+ if (get.attitude(player, source) > 0) return Math.max(1, source.getUseValue(card, null, true));
+ var cards = _status.event.getParent().cards.slice(0);
+ if (cards.length == 1) return -get.value(card);
+ cards.remove(card);
+ return get.value(cards) - get.value(card) - 2;
+ })
+ .set("source", event.target)
+ .setHiddenSkill(event.name);
+ "step 1";
+ if (result.bool) {
+ player.logSkill("jyishi", target);
+ if (cards.length > 1) {
+ target.$gain2(result.links[0]);
+ target.gain(result.links[0], "log");
+ } else trigger.player.gain(result.links[0], "gain2");
+ cards.remove(result.links[0]);
+ if (cards.length) player.gain(cards, "gain2");
+ } else player.storage.counttrigger.jyishi--;
+ },
+ },
+ jyishi2: { charlotte: true },
+ shiduo: {
+ audio: 2,
+ enable: "phaseUse",
+ usable: 1,
+ filter: function (event, player) {
+ return game.hasPlayer(function (target) {
+ return player != target && player.canCompare(target);
+ });
+ },
+ filterTarget: function (card, player, target) {
+ return player != target && player.canCompare(target);
+ },
+ content: function () {
+ "step 0";
+ player.chooseToCompare(target);
+ "step 1";
+ if (result.bool && target.isAlive()) {
+ var num = target.countCards("h");
+ if (num > 0) player.gainPlayerCard(target, true, "h", num);
+ } else event.finish();
+ "step 2";
+ var num = Math.floor(player.countCards("h") / 2);
+ if (num && target.isAlive()) player.chooseCard("h", num, true, "交给" + get.translation(target) + get.cnNumber(num) + "张牌");
+ else event.finish();
+ "step 3";
+ if (result.bool && result.cards && result.cards.length) player.give(result.cards, target);
+ },
+ ai: {
+ order: 1,
+ result: {
+ target: function (player, target) {
+ var delta = target.countCards("h") - player.countCards("h");
+ if (delta < 0) return 0;
+ return -1 - delta;
+ },
+ },
+ },
+ },
+ tuishi: {
+ audio: 2,
+ trigger: { player: "showCharacterAfter" },
+ forced: true,
+ locked: false,
+ hiddenSkill: true,
+ filter: function (event, player) {
+ var target = _status.currentPhase;
+ return player != target && target && target.isAlive() && event.toShow && event.toShow.includes("jin_simazhao");
+ },
+ content: function () {
+ player.addTempSkill("tuishi2");
+ },
+ },
+ tuishi2: {
+ trigger: { global: "phaseEnd" },
+ direct: true,
+ charlotte: true,
+ filter: function (event, player) {
+ var target = _status.currentPhase;
+ return (
+ target != player &&
+ target &&
+ target.isAlive() &&
+ game.hasPlayer(function (current) {
+ return current != target && target.inRange(current);
+ })
+ );
+ },
+ content: function () {
+ "step 0";
+ var target = _status.currentPhase;
+ event.target = target;
+ player
+ .chooseTarget(get.prompt2("tuishi", event.target), function (card, player, target) {
+ var source = _status.event.source;
+ return source != target && source.inRange(target);
+ })
+ .set("source", target)
+ .set("goon", get.damageEffect(target, player, player) > 0)
+ .set("ai", function (target) {
+ if (!_status.event.goon) return 0;
+ var evt = _status.event;
+ return get.effect(target, { name: "sha" }, evt.source, evt.player);
+ });
+ "step 1";
+ if (result.bool) {
+ event.target2 = result.targets[0];
+ player.logSkill("tuishi");
+ player.line2([target, event.target2]);
+ game.delayx();
+ } else event.finish();
+ "step 2";
+ target.chooseToUse({
+ preTarget: event.target2,
+ prompt: "请对" + get.translation(event.target2) + "使用一张【杀】,或受到来自" + get.translation(player) + "的1点伤害",
+ filterCard: function (card, player) {
+ return get.name(card) == "sha" && lib.filter.filterCard.apply(this, arguments);
+ },
+ filterTarget: function (card, player, target) {
+ return target == _status.event.preTarget && lib.filter.filterTarget.apply(this, arguments);
+ },
+ addCount: false,
+ });
+ "step 3";
+ if (!result.bool) target.damage();
+ },
+ },
+ xinchoufa: {
+ audio: "choufa",
+ inherit: "choufa",
+ content: function () {
+ "step 0";
+ player.choosePlayerCard(target, "h", true);
+ "step 1";
+ player.showCards(result.cards, get.translation(player) + "对" + get.translation(target) + "发动了【筹伐】");
+ var type = get.type2(result.cards[0], target),
+ hs = target.getCards("h", function (card) {
+ return card != result.cards[0] && get.type2(card, target) != type;
+ });
+ if (hs.length) {
+ target.addGaintag(hs, "xinchoufa");
+ target.addTempSkill("xinchoufa2", { player: "phaseAfter" });
+ }
+ },
+ },
+ xinchoufa2: {
+ charlotte: true,
+ onremove: function (player) {
+ player.removeGaintag("xinchoufa");
+ },
+ mod: {
+ cardname: function (card) {
+ if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return "sha";
+ },
+ cardnature: function (card) {
+ if (get.itemtype(card) == "card" && card.hasGaintag("xinchoufa")) return false;
+ },
+ },
+ },
+ choufa: {
+ enable: "phaseUse",
+ audio: 2,
+ usable: 1,
+ filter: function (event, player) {
+ return game.hasPlayer(function (current) {
+ return lib.skill.choufa.filterTarget(null, player, current);
+ });
+ },
+ filterTarget: function (card, player, target) {
+ return target != player && !target.hasSkill("choufa2") && target.countCards("h") > 0;
+ },
+ content: function () {
+ "step 0";
+ player.choosePlayerCard(target, "h", true);
+ "step 1";
+ player.showCards(result.cards);
+ var type = get.type2(result.cards[0], target);
+ target.storage.choufa2 = type;
+ target.addTempSkill("choufa2", { player: "phaseAfter" });
+ },
+ ai: {
+ order: 9,
+ result: {
+ target: function (player, target) {
+ return -target.countCards("h");
+ },
+ },
+ },
+ },
+ choufa2: {
+ onremove: true,
+ charlotte: true,
+ mark: true,
+ intro: { content: "手牌中的非$牌均视为杀" },
+ mod: {
+ cardname: function (card, player) {
+ if (get.type2(card, false) != player.storage.choufa2) return "sha";
+ },
+ cardnature: function (card, player) {
+ if (get.type2(card, false) != player.storage.choufa2) return false;
+ },
+ },
+ },
+ zhaoran: {
+ audio: 2,
+ trigger: { player: "phaseUseBegin" },
+ preHidden: true,
+ content: function () {
+ player.addTempSkill("zhaoran2", "phaseUseAfter");
+ var cards = player.getCards("h");
+ if (cards.length > 0) player.addShownCards(cards, "visible_zhaoran");
+ },
+ },
+ zhaoran2: {
+ audio: "zhaoran",
+ group: "zhaoran3",
+ init: (player, skill) => {
+ if (!player.storage[skill]) player.storage[skill] = [];
+ },
+ onremove: true,
+ trigger: {
+ player: "loseAfter",
+ global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"],
+ },
+ forced: true,
+ charlotte: true,
+ popup: false,
+ filter: function (event, player, name) {
+ if (name == "gainBegin") return true;
+ var evt = event.getl(player);
+ if (!evt || !evt.hs || !evt.hs.length) return false;
+ var list = player.getStorage("zhaoran2");
+ for (var i of evt.hs) {
+ var suit = get.suit(i, player);
+ if (!list.includes(suit) && !player.countCards("h", { suit: suit })) return true;
+ }
+ return false;
+ },
+ content: function () {
+ "step 0";
+ if (trigger.delay === false) game.delayx();
+ "step 1";
+ var list = [];
+ var suits = get.copy(player.storage.zhaoran2);
+ suits.addArray(
+ player.getCards("h").map(function (card) {
+ return get.suit(card);
+ })
+ );
+ var evt = trigger.getl(player);
+ for (var i of evt.hs) {
+ var suit = get.suit(i, player);
+ if (!suits.includes(suit)) list.add(suit);
+ }
+ event.count = list.length;
+ player.markAuto("zhaoran2", list);
+ "step 1";
+ event.count--;
+ var filterTarget = function (card, player, target) {
+ return target != player && target.countDiscardableCards(player, "he") > 0;
+ };
+ if (
+ !game.hasPlayer(function (current) {
+ return filterTarget(null, player, current);
+ })
+ )
+ event._result = { bool: false };
+ else
+ player.chooseTarget(filterTarget, "弃置一名其他角色的一张牌或摸一张牌").set("ai", function (target) {
+ var att = get.attitude(player, target);
+ if (att >= 0) return 0;
+ if (
+ target.countCards("he", function (card) {
+ return get.value(card) > 5;
+ })
+ )
+ return -att;
+ return 0;
+ });
+ "step 2";
+ if (!result.bool) {
+ player.logSkill("zhaoran2");
+ player.draw();
+ } else {
+ var target = result.targets[0];
+ player.logSkill("zhaoran2", target);
+ player.discardPlayerCard(target, true, "he");
+ }
+ if (event.count > 0) event.goto(1);
+ },
+ intro: {
+ content: "已因$牌触发过效果",
+ },
+ },
+ zhaoran3: {
+ trigger: { player: ["phaseUseEnd", "gainBegin"] },
+ forced: true,
+ charlotte: true,
+ firstDo: true,
+ silent: true,
+ content: function () {
+ if (event.triggername == "gainBegin") {
+ trigger.gaintag.add("visible_zhaoran");
+ } else {
+ player.hideShownCards(player.getCards("h"), "visible_zhaoran");
+ }
+ },
+ },
+ chengwu: {
+ zhuSkill: true,
+ mod: {
+ inRange: function (from, to) {
+ if (!from.hasZhuSkill("chengwu") || from._chengwu) return;
+ from._chengwu = true;
+ var bool = game.hasPlayer(function (current) {
+ return current != from && current != to && current.group == "jin" && from.hasZhuSkill("chengwu", current) && current.inRange(to);
+ });
+ delete from._chengwu;
+ if (bool) return true;
+ },
+ },
+ },
+ shiren: {
+ trigger: { player: "showCharacterAfter" },
+ hiddenSkill: true,
+ logTarget: function () {
+ return _status.currentPhase;
+ },
+ filter: function (event, player) {
+ if (!event.toShow || !event.toShow.includes("jin_wangyuanji")) return false;
+ var target = _status.currentPhase;
+ return target && target != player && target.isAlive() && target.countCards("h") > 0;
+ },
+ content: function () {
+ var next = game.createEvent("yanxi", false);
+ next.player = player;
+ next.target = _status.currentPhase;
+ next.setContent(lib.skill.yanxi.content);
+ },
+ },
+ yanxi: {
+ enable: "phaseUse",
+ usable: 1,
+ filterTarget: function (card, player, target) {
+ return target != player && target.countCards("h") > 0;
+ },
+ filter: function (event, player) {
+ return game.hasPlayer(function (current) {
+ return current != player && current.countCards("h") > 0;
+ });
+ },
+ content: function () {
+ "step 0";
+ event.card = target.getCards("h").randomGet();
+ var cards;
+ cards = get.cards(2);
+ event.cards = cards.concat([event.card]);
+ while (cards.length) {
+ ui.cardPile.insertBefore(cards.pop().fix(), ui.cardPile.firstChild);
+ }
+ if (get.mode() == "guozhan") {
+ var num = ui.cardPile.childElementCount;
+ var num1 = get.rand(1, num - 1),
+ num2 = get.rand(1, num - 1);
+ if (num1 == num2) {
+ if (num1 == 0) num2++;
+ else num1--;
+ }
+ event.cards = [event.card, ui.cardPile.childNodes[num1], ui.cardPile.childNodes[num2]];
+ }
+ game.updateRoundNumber();
+ event.cards.randomSort();
+ game.log(player, "展示了", event.cards);
+ event.videoId = lib.status.videoId++;
+ var str = get.translation(player) + "对" + get.translation(target) + "发动了【宴戏】";
+ game.broadcastAll(
+ function (str, id, cards) {
+ var dialog = ui.create.dialog(str, cards);
+ dialog.videoId = id;
+ },
+ str,
+ event.videoId,
+ event.cards
+ );
+ game.addVideo("showCards", player, [str, get.cardsInfo(event.cards)]);
+ game.delay(2);
+ "step 1";
+ var func = function (id, target) {
+ var dialog = get.idDialog(id);
+ if (dialog) dialog.content.firstChild.innerHTML = "猜猜哪张是" + get.translation(target) + "的手牌?";
+ };
+ if (player == game.me) func(event.videoId, target);
+ else if (player.isOnline()) player.send(func, event.videoId, target);
+ "step 2";
+ var next = player.chooseButton(true);
+ next.set("dialog", event.videoId);
+ next.set("ai", function (button) {
+ if (_status.event.answer) return button.link == _status.event.answer ? 1 : 0;
+ return get.value(button.link, _status.event.player);
+ });
+ if (player.hasSkillTag("viewHandcard", null, target, true)) next.set("answer", card);
+ "step 3";
+ game.broadcastAll("closeDialog", event.videoId);
+ player.addTempSkill("yanxi2");
+ var card2 = result.links[0];
+ if (card2 == card) {
+ player.popup("洗具");
+ cards.remove(card2);
+ player.$gain2(cards);
+ player.gain(cards, "log").gaintag.add("yanxi");
+ player.gain(card, target, "bySelf", "give").gaintag.add("yanxi");
+ } else {
+ player.popup("杯具");
+ player.gain(card2, "gain2").gaintag.add("yanxi");
+ }
+ },
+ ai: {
+ order: 6,
+ result: {
+ player: 1,
+ target: -0.6,
+ },
+ },
+ },
+ yanxi2: {
+ mod: {
+ ignoredHandcard: function (card, player) {
+ if (card.hasGaintag("yanxi")) return true;
+ },
+ cardDiscardable: function (card, player, name) {
+ if (name == "phaseDiscard" && card.hasGaintag("yanxi")) return false;
+ },
+ },
+ onremove: function (player) {
+ player.removeGaintag("yanxi");
+ },
+ },
+ sanchen: {
+ enable: "phaseUse",
+ usable: 1,
+ filter: function (event, player) {
+ var stat = player.getStat("sanchen");
+ return game.hasPlayer(function (current) {
+ return !stat || !stat.includes(current);
+ });
+ },
+ filterTarget: function (card, player, target) {
+ var stat = player.getStat("sanchen");
+ return !stat || !stat.includes(target);
+ },
+ content: function () {
+ "step 0";
+ var stat = player.getStat();
+ if (!stat.sanchen) stat.sanchen = [];
+ stat.sanchen.push(target);
+ if (get.mode() != "guozhan") player.addMark("sanchen", 1, false);
+ target.draw(3);
+ "step 1";
+ if (!target.countCards("he")) event._result = { bool: false };
+ else
+ target.chooseToDiscard("he", true, 3).set("ai", function (card) {
+ var list = ui.selected.cards.map(function (i) {
+ return get.type2(i);
+ });
+ if (!list.includes(get.type2(card))) return 7 - get.value(card);
+ return -get.value(card);
+ });
+ "step 2";
+ if (result.bool && result.cards && result.cards.length) {
+ var list = [];
+ for (var i of result.cards) list.add(get.type2(i));
+ if (list.length == result.cards.length) {
+ target.draw();
+ player.getStat("skill").sanchen--;
+ if (get.mode() == "guozhan") player.addTempSkills("pozhu");
+ }
+ } else {
+ target.draw();
+ player.getStat("skill").sanchen--;
+ if (get.mode() == "guozhan") player.addTempSkills("pozhu");
+ }
+ },
+ ai: {
+ order: 9,
+ threaten: 1.7,
+ result: {
+ target: function (player, target) {
+ if (target.hasSkillTag("nogain")) return 0.1;
+ return Math.sqrt(target.countCards("he"));
+ },
+ },
+ },
+ intro: {
+ content: "已发动过#次技能",
+ },
+ marktext: "陈",
+ },
+ zhaotao: {
+ forbid: ["guozhan"],
+ trigger: { player: "phaseZhunbeiBegin" },
+ forced: true,
+ juexingji: true,
+ skillAnimation: true,
+ animationColor: "thunder",
+ filter: function (event, player) {
+ return player.countMark("sanchen") > 2;
+ },
+ content: function () {
+ player.awakenSkill("zhaotao");
+ player.loseMaxHp();
+ player.addSkills("pozhu");
+ },
+ derivation: "pozhu",
+ ai: {
+ combo: "sanchen",
+ },
+ },
+ pozhu: {
+ enable: "phaseUse",
+ viewAsFilter: function (player) {
+ return !player.hasSkill("pozhu3", null, null, false) && player.countCards("hs") > 0;
+ },
+ viewAs: { name: "chuqibuyi" },
+ filterCard: true,
+ position: "hs",
+ check: function (card) {
+ return 7 - get.value(card);
+ },
+ group: "pozhu2",
+ },
+ pozhu2: {
+ trigger: { player: "useCardAfter" },
+ silent: true,
+ filter: function (event, player) {
+ return (
+ event.skill == "pozhu" &&
+ (get.mode() == "guozhan" ||
+ !player.getHistory("sourceDamage", function (evt) {
+ return evt.card == event.card;
+ }).length)
+ );
+ },
+ content: function () {
+ player.addTempSkill("pozhu3");
+ },
+ },
+ pozhu3: { charlotte: true },
+ xijue: {
+ audio: 2,
+ trigger: {
+ global: "phaseBefore",
+ player: ["enterGame", "showCharacterAfter"],
+ },
+ forced: true,
+ filter: function (event, player) {
+ if (player._xijue) return false;
+ if (get.mode() == "guozhan") return event.name == "showCharacter" && event.toShow && event.toShow.includes("gz_zhanghuyuechen");
+ return event.name != "showCharacter" && (event.name != "phase" || game.phaseNumber == 0);
+ },
+ content: function () {
+ player.addMark("xijue", 4);
+ player._xijue = true;
+ },
+ intro: {
+ name2: "爵",
+ content: "mark",
+ },
+ derivation: ["xijue_tuxi", "xijue_xiaoguo"],
+ group: ["xijue_gain", "xijue_tuxi", "xijue_xiaoguo"],
+ },
+ xijue_gain: {
+ audio: "xijue",
+ trigger: { player: "phaseEnd" },
+ forced: true,
+ filter: function (event, player) {
+ var stat = player.getStat();
+ return stat.damage && stat.damage > 0;
+ },
+ content: function () {
+ player.addMark("xijue", player.getStat().damage);
+ },
+ },
+ xijue_tuxi: {
+ audio: 2,
+ trigger: {
+ player: "phaseDrawBegin2",
+ },
+ direct: true,
+ filter: function (event, player) {
+ return (
+ event.num > 0 &&
+ !event.numFixed &&
+ player.hasMark("xijue") &&
+ game.hasPlayer(function (target) {
+ return player != target && target.countCards("h") > 0;
+ })
+ );
+ },
+ content: function () {
+ "step 0";
+ var num = trigger.num;
+ if (get.mode() == "guozhan" && num > 2) num = 2;
+ player.chooseTarget(
+ "是否弃置一枚“爵”发动【突袭】?",
+ "获得至多" + get.translation(num) + "名角色的各一张手牌,然后少摸等量的牌",
+ [1, num],
+ function (card, player, target) {
+ return target.countCards("h") > 0 && player != target;
+ },
+ function (target) {
+ var att = get.attitude(_status.event.player, target);
+ if (target.hasSkill("tuntian")) return att / 10;
+ return 1 - att;
+ }
+ );
+ "step 1";
+ if (result.bool) {
+ result.targets.sortBySeat();
+ player.logSkill("xijue_tuxi", result.targets);
+ player.removeMark("xijue", 1);
+ player.gainMultiple(result.targets);
+ trigger.num -= result.targets.length;
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (trigger.num <= 0) game.delay();
+ },
+ ai: {
+ expose: 0.2,
+ },
+ },
+ xijue_xiaoguo: {
+ audio: 2,
+ trigger: { global: "phaseJieshuBegin" },
+ filter: function (event, player) {
+ return (
+ player.hasMark("xijue") &&
+ event.player.isAlive() &&
+ event.player != player &&
+ player.countCards("h", function (card) {
+ if (_status.connectMode || get.mode() != "guozhan") return true;
+ return get.type(card) == "basic";
+ })
+ );
+ },
+ direct: true,
+ content: function () {
+ "step 0";
+ var nono =
+ Math.abs(get.attitude(player, trigger.player)) < 3 ||
+ trigger.player.hp > player.countMark("xijue") * 1.5 ||
+ trigger.player.countCards("e", function (card) {
+ return get.value(card, trigger.player) <= 0;
+ });
+ if (get.damageEffect(trigger.player, player, player) <= 0) {
+ nono = true;
+ }
+ var next = player.chooseToDiscard(`是否弃置一枚“爵”和一张${get.mode() == "guozhan" ? "基本" : "手"}牌,对${get.translation(trigger.player)}发动【骁果】?`, "h", function (card, player) {
+ if (get.mode() != "guozhan") return true;
+ return get.type(card, player) == "basic";
+ });
+ next.set("ai", function (card) {
+ if (_status.event.nono) return 0;
+ return 8 - get.useful(card);
+ });
+ next.set("logSkill", ["xijue_xiaoguo", trigger.player]);
+ next.set("nono", nono);
+ "step 1";
+ if (result.bool) {
+ player.removeMark("xijue", 1);
+ var nono = get.damageEffect(trigger.player, player, trigger.player) >= 0;
+ trigger.player
+ .chooseToDiscard("he", "弃置一张装备牌并令" + get.translation(player) + "摸一张牌,或受到1点伤害", { type: "equip" })
+ .set("ai", function (card) {
+ if (_status.event.nono) {
+ return 0;
+ }
+ if (_status.event.player.hp == 1) return 10 - get.value(card);
+ return 9 - get.value(card);
+ })
+ .set("nono", nono);
+ } else {
+ event.finish();
+ }
+ "step 2";
+ if (result.bool) {
+ if (get.mode() != "guozhan") player.draw();
+ } else {
+ trigger.player.damage();
+ }
+ },
+ ai: {
+ expose: 0.3,
+ threaten: 1.3,
+ },
+ },
+ huishi: {
+ audio: 2,
+ trigger: { player: "phaseDrawBegin1" },
+ filter: function (event, player) {
+ return ui.cardPile.childElementCount % 10 > 0 && !event.numFixed;
+ },
+ preHidden: true,
+ prompt: function () {
+ return get.prompt("huishi") + "(当前牌堆尾数:" + (ui.cardPile.childElementCount % 10) + ")";
+ },
+ check: function (event, player) {
+ return ui.cardPile.childElementCount % 10 > 3;
+ },
+ content: function () {
+ "step 0";
+ trigger.changeToZero();
+ var cards = game.cardsGotoOrdering(get.cards(ui.cardPile.childElementCount % 10)).cards;
+ var num = Math.ceil(cards.length / 2);
+ var next = player.chooseToMove("慧识:将" + get.cnNumber(num) + "张牌置于牌堆底并获得其余的牌", true);
+ next.set("list", [["牌堆顶的展示牌", cards], ["牌堆底"]]);
+ next.set("filterMove", function (from, to, moved) {
+ if (moved[0].includes(from) && to == 1) return moved[1].length < _status.event.num;
+ return true;
+ });
+ next.set("filterOk", function (moved) {
+ return moved[1].length == _status.event.num;
+ });
+ next.set("num", num);
+ next.set("processAI", function (list) {
+ var cards = list[0][1].slice(0).sort(function (a, b) {
+ return get.value(b) - get.useful(a);
+ });
+ return [cards, cards.splice(cards.length - _status.event.num)];
+ });
+ "step 1";
+ if (result.bool) {
+ var list = result.moved;
+ if (list[0].length) player.gain(list[0], "gain2");
+ while (list[1].length) ui.cardPile.appendChild(list[1].shift().fix());
+ }
+ },
+ },
+ qingleng: {
+ audio: 2,
+ trigger: { global: "phaseEnd" },
+ direct: true,
+ preHidden: true,
+ filter: function (event, player) {
+ var target = event.player;
+ return target != player && target.isIn() && !target.storage.nohp && target.hp + target.countCards("h") >= ui.cardPile.childElementCount % 10 && player.countCards("he") > 0 && player.canUse({ name: "sha", nature: "ice" }, target, false);
+ },
+ content: function () {
+ "step 0";
+ player
+ .chooseCard("he", get.prompt("qingleng", trigger.player), "将一张牌当做冰【杀】对其使用", function (card, player) {
+ return player.canUse(get.autoViewAs({ name: "sha", nature: "ice" }, [card]), _status.event.target, false);
+ })
+ .set("target", trigger.player)
+ .set("ai", function (card) {
+ if (get.effect(_status.event.target, get.autoViewAs({ name: "sha", nature: "ice" }, [card]), player) <= 0) return false;
+ return 6 - get.value(card);
+ })
+ .setHiddenSkill(event.name);
+ "step 1";
+ if (result.bool) {
+ player.useCard(get.autoViewAs({ name: "sha", nature: "ice" }, result.cards), result.cards, false, trigger.player, "qingleng");
+ if (!player.storage.qingleng || !player.storage.qingleng.includes(trigger.player)) {
+ player.draw();
+ player.markAuto("qingleng", [trigger.player]);
+ player.storage.qingleng.sortBySeat();
+ }
+ }
+ },
+ intro: {
+ content: "已对$发动过此技能",
+ },
+ },
+ xuanmu: {
+ audio: 2,
+ trigger: { player: "showCharacterAfter" },
+ forced: true,
+ hiddenSkill: true,
+ filter: function (event, player) {
+ return event.toShow.includes("jin_zhangchunhua") && player != _status.currentPhase;
+ },
+ content: function () {
+ player.addTempSkill("xuanmu2");
+ },
+ },
+ xuanmu2: {
+ trigger: { player: "damageBegin4" },
+ forced: true,
+ popup: false,
+ content: function () {
+ trigger.cancel();
+ },
+ ai: {
+ effect: {
+ target: function (card, player, target) {
+ if (get.tag(card, "damage") && !player.hasSkillTag("jueqing", false, target)) return "zerotarget";
+ },
+ },
+ },
+ },
+ g_hidden_ai: {
+ charlotte: true,
+ ai: {
+ threaten: function (player, target) {
+ if (get.mode() != "guozhan" && target.isUnseen(2)) return 0.0001;
+ return 1;
+ },
+ },
+ },
+};
+
+export default skills;
diff --git a/character/yingbian/sort.js b/character/yingbian/sort.js
new file mode 100644
index 000000000..82a6e648a
--- /dev/null
+++ b/character/yingbian/sort.js
@@ -0,0 +1,17 @@
+const characterSort = {
+ yingbian_pack1: ["jin_simayi", "jin_zhangchunhua", "ol_lisu", "simazhou", "cheliji", "ol_huaxin"],
+ yingbian_pack2: ["jin_simashi", "jin_xiahouhui", "zhanghuyuechen", "shibao", "jin_yanghuiyu", "chengjichengcui"],
+ yingbian_pack3: ["jin_simazhao", "jin_wangyuanji", "duyu", "weiguan", "xuangongzhu"],
+ yingbian_pack4: ["zhongyan", "xinchang", "jin_jiachong", "wangxiang"],
+ yingbian_pack5: ["yangyan", "yangzhi"],
+};
+
+const characterSortTranslate = {
+ yingbian_pack1: "文德武备·理",
+ yingbian_pack2: "文德武备·备",
+ yingbian_pack3: "文德武备·果",
+ yingbian_pack4: "文德武备·戒",
+ yingbian_pack5: "文德武备·约",
+};
+
+export { characterSort, characterSortTranslate };
diff --git a/character/yingbian/translate.js b/character/yingbian/translate.js
new file mode 100644
index 000000000..c380ea733
--- /dev/null
+++ b/character/yingbian/translate.js
@@ -0,0 +1,211 @@
+const translates = {
+ jin_zhangchunhua: "晋张春华",
+ jin_zhangchunhua_prefix: "晋",
+ huishi: "慧识",
+ huishi_info: "摸牌阶段,你可以放弃摸牌,改为观看牌堆顶的X张牌,获得其中的一半(向下取整),然后将其余牌置入牌堆底。(X为牌堆数量的个位数)",
+ qingleng: "清冷",
+ qingleng_info: "一名角色的回合结束时,若其体力值与手牌数之和不小于X,则你可将一张牌当无距离限制的冰属性【杀】对其使用(X为牌堆数量的个位数)。若这是你本局游戏内首次对其发动此技能,则你摸一张牌。",
+ xuanmu: "宣穆",
+ xuanmu2: "宣穆",
+ xuanmu_info: "锁定技,隐匿技。你于其他角色的回合登场时,防止你受到的伤害直到回合结束。",
+ jin_simayi: "晋司马懿",
+ jin_simayi_prefix: "晋",
+ zhanghuyuechen: "张虎乐綝",
+ xijue: "袭爵",
+ xijue_gain: "袭爵",
+ xijue_info: "锁定技,游戏开始时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。",
+ xijue_info_guozhan: "锁定技,当你首次明置此武将牌时,你获得4枚“爵”。回合结束时,你获得X枚“爵”(X为你本回合内造成的伤害数)。你可弃置一枚“爵”并在合适的时机发动〖突袭〗和〖骁果〗。",
+ xijue_tuxi: "突袭",
+ xijue_tuxi_info: "摸牌阶段摸牌时,你可以少摸任意张牌,然后获得等量的角色的各一张手牌。",
+ xijue_tuxi_info_guozhan: "摸牌阶段摸牌时,你可以少摸至多两张牌,然后获得等量的角色的各一张手牌。",
+ xijue_xiaoguo: "骁果",
+ xijue_xiaoguo_info: "其他角色的结束阶段开始时,你可以弃置一张手牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。",
+ xijue_xiaoguo_info_guozhan: "其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。",
+ gz_duyu: "杜预",
+ duyu: "晋杜预",
+ duyu_prefix: "晋",
+ sanchen: "三陈",
+ sanchen_info: "出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。",
+ sanchen_info_guozhan: "出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。",
+ zhaotao: "诏讨",
+ zhaotao_info: "觉醒技,准备阶段,若你本局游戏内发动〖三陈〗的次数大于2,则你减1点体力上限并获得〖破竹〗。",
+ pozhu: "破竹",
+ pozhu_info: "出牌阶段,你可以将一张手牌当做【出其不意】使用。若你未因此牌造成过伤害,则你不能再发动〖破竹〗直到回合结束。",
+ pozhu_info_guozhan: "出牌阶段限一次,你可以将一张手牌当做【出其不意】使用。",
+ jin_wangyuanji: "晋王元姬",
+ jin_wangyuanji_prefix: "晋",
+ shiren: "识人",
+ shiren_info: "隐匿技。你于其他角色的回合内登场时,若其有手牌,则你可对其发动〖宴戏〗。",
+ yanxi: "宴戏",
+ yanxi2: "宴戏",
+ yanxi_info: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆顶的两张牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。",
+ yanxi_info_guozhan: "出牌阶段,你可选择一名有手牌的角色。你将该角色的一张随机手牌与牌堆中的两张随机牌混合后展示,并选择其中一张。若你以此法选择的是该角色的手牌,则你获得这三张牌。否则你获得选择的牌。你通过〖宴戏〗得到的牌,不计入当前回合的手牌上限。",
+ jin_simazhao: "晋司马昭",
+ jin_simazhao_prefix: "晋",
+ tuishi: "推弑",
+ tuishi_info: "隐匿技,你于其他角色A的回合内登场时,可于此回合结束时选择其攻击范围内的一名角色B。A选择一项:①对B使用一张【杀】。②你对A造成1点伤害。",
+ choufa: "筹伐",
+ choufa2: "筹伐",
+ choufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌并记录其类型A。你令其原类型不为A的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。",
+ xinchoufa: "筹伐",
+ xinchoufa_info: "出牌阶段限一次,你可展示一名其他角色的一张手牌A。你令其所有类型与A不同的手牌的牌名均视为【杀】且均视为无属性,直到其回合结束。",
+ zhaoran: "昭然",
+ zhaoran2: "昭然",
+ zhaoran_info: "出牌阶段开始时,你可令你的手牌对其他角色可见直到出牌阶段结束。若如此做,当你于此阶段内失去一张手牌后,若你的手牌里没有与此牌花色相同的牌且你本回合内未因该花色的牌触发过此效果,则你选择一项:①摸一张牌。②弃置一名其他角色的一张牌。",
+ visible_zhaoran: "invisible",
+ chengwu: "成务",
+ chengwu_info: "主公技,锁定技,其他晋势力角色攻击范围内的角色视为在你的攻击范围内。",
+ jin_xiahouhui: "晋夏侯徽",
+ jin_xiahouhui_prefix: "晋",
+ baoqie: "宝箧",
+ baoqie_info: "隐匿技,锁定技。你登场后,从牌堆或弃牌堆中获得一张不为赠物的宝物牌。若此牌在你的手牌区内为宝物牌,则你可以使用此牌。",
+ jyishi: "宜室",
+ jyishi_info: "每回合限一次,当有其他角色于其出牌阶段内因弃置而失去手牌后,你可令其获得这些牌中位于弃牌堆的一张,然后你获得其余位于弃牌堆的牌。",
+ shiduo: "识度",
+ shiduo_info: "出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得其所有手牌。然后你交给其X张手牌(X为你手牌数的一半,向下取整)。",
+ jin_simashi: "晋司马师",
+ jin_simashi_prefix: "晋",
+ taoyin: "韬隐",
+ taoyin2: "韬隐",
+ taoyin_info: "隐匿技,当你登场后,若当前回合角色存在且不是你,则你可令该角色本回合的手牌上限-2。",
+ yimie: "夷灭",
+ yimie2: "夷灭",
+ yimie_info: "每回合限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力(Y为其体力值)。",
+ ruilve: "睿略",
+ ruilve2: "睿略",
+ ruilve_info: "主公技,其他晋势力角色的出牌阶段限一次,该角色可以将一张带有伤害标签的基本牌或锦囊牌交给你。",
+ tairan: "泰然",
+ tairan2: "泰然",
+ tairan_info: "锁定技,回合结束时,你将体力回复至体力上限,并将手牌摸至体力上限(称为“泰然”牌,且至多摸五张)。然后你的下一个出牌阶段开始时,你失去上一次以此法回复的体力值的体力,弃置所有“泰然”牌。",
+ gz_jin_simayi: "司马懿",
+ gz_jin_zhangchunhua: "张春华",
+ gz_jin_simazhao: "司马昭",
+ gz_jin_wangyuanji: "王元姬",
+ gz_jin_simashi: "司马师",
+ gz_jin_xiahouhui: "夏侯徽",
+ xinquanbian: "权变",
+ xinquanbian_info: "出牌阶段,每当你首次使用/打出一种花色的手牌时,你可以从牌堆顶的X张牌中获得一张与此牌花色不同的牌,并将其余牌以任意顺序置于牌堆顶。出牌阶段,你至多可使用X张非装备手牌。(X为你的体力上限)",
+ shibao: "石苞",
+ zhuosheng: "擢升",
+ zhuosheng_info: "出牌阶段,①你使用本轮内得到的基本牌时无次数和距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。",
+ zhuosheng_info_guozhan: "出牌阶段,①你使用本轮内得到的基本牌时无距离限制。②你使用本轮内获得的普通锦囊牌选择目标后,可令此牌的目标数+1或-1。③你使用本轮内得到的装备牌时可以摸一张牌(以此法得到的牌不能触发〖擢升〗)。",
+ jin_yanghuiyu: "晋羊徽瑜",
+ jin_yanghuiyu_prefix: "晋",
+ gz_jin_yanghuiyu: "羊徽瑜",
+ huirong: "慧容",
+ huirong_info: "隐匿技,锁定技。当你登场后,你令一名角色将手牌数摸至/弃至与体力值相同(至多摸至五张)。",
+ ciwei: "慈威",
+ ciwei_info: "一名角色于其回合内使用第二张牌时,若此牌为基本牌或普通锦囊牌,则你可以弃置一张牌,取消此牌的所有目标。",
+ caiyuan: "才媛",
+ caiyuan_info: "锁定技。回合结束时,若你于你的上一个回合结束后未扣减过体力,则你摸两张牌。",
+ simazhou: "司马伷",
+ caiwang: "才望",
+ caiwang_info: "当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。",
+ naxiang: "纳降",
+ naxiang2: "纳降",
+ naxiang_info: "锁定技,当你受到其他角色造成的伤害后,或你对其他角色造成伤害后,你对其发动〖才望①〗时的“弃置”改为“获得”直到你的下回合开始。",
+ cheliji: "彻里吉",
+ chexuan: "车悬",
+ chexuan_info: "出牌阶段,若你的装备区里没有宝物牌,你可弃置一张黑色牌,选择一张【舆】置入你的装备区;当你失去装备区里的宝物牌后,你可进行判定,若结果为黑色,将一张随机的【舆】置入你的装备区。",
+ qiangshou: "羌首",
+ qiangshou_info: "锁定技,若你的装备区内有宝物牌,你与其他角色的距离-1。",
+ cheliji_sichengliangyu: "四乘粮舆",
+ cheliji_sichengliangyu_bg: "粮",
+ cheliji_sichengliangyu_info: "一名角色的回合结束时,若你的手牌数小于体力值,你可以摸两张牌,然后弃置此牌。",
+ cheliji_tiejixuanyu: "铁蒺玄舆",
+ cheliji_tiejixuanyu_bg: "蒺",
+ cheliji_tiejixuanyu_info: "其他角色的回合结束时,若其本回合未造成过伤害,你可以令其弃置两张牌,然后弃置此牌。",
+ cheliji_feilunzhanyu: "飞轮战舆",
+ cheliji_feilunzhanyu_bg: "轮",
+ cheliji_feilunzhanyu_info: "其他角色的回合结束时,若其本回合使用过非基本牌,你可以令其交给你一张牌,然后弃置此牌。",
+ weiguan: "卫瓘",
+ zhongyun: "忠允",
+ zhongyun2: "忠允",
+ zhongyun_info: "锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复1点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。",
+ shenpin: "神品",
+ shenpin_info: "当一名角色的判定牌生效前,你可以打出一张与判定牌颜色不同的牌代替之。",
+ zhongyan: "钟琰",
+ bolan: "博览",
+ bolan_info: "①出牌阶段开始时,你可从三个描述中带有“出牌阶段限一次”的技能中选择一个,令当前回合角色获得直至此阶段结束。②其他角色出牌阶段限一次,其可以失去1点体力,令你发动一次〖博览①〗。",
+ yifa: "仪法",
+ yifa2: "仪法",
+ yifa_info: "锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到其回合结束。",
+ ol_huaxin: "OL华歆",
+ ol_huaxin_prefix: "OL",
+ caozhao: "草诏",
+ caozhao_backup: "草诏",
+ caozhao_info: "出牌阶段限一次,你可展示一张手牌并声明一种未以此法声明过的基本牌或普通锦囊牌,令一名体力不大于你的其他角色选择一项:令此牌视为你声明的牌,或其失去1点体力。然后若此牌声明成功,然后你可将其交给一名其他角色。",
+ olxibing: "息兵",
+ olxibing_info: "当你受到其他角色造成的伤害后,你可弃置你或该角色两张牌,然后你们中手牌少的角色摸两张牌,以此法摸牌的角色不能使用牌指定你为目标直到回合结束。",
+ recaiwang: "才望",
+ recaiwang_info: "①当你使用或打出牌响应其他角色使用的牌,或其他角色使用或打出牌响应你使用的牌后,若这两张牌颜色相同,则你可以弃置对方的一张牌。②若你的手牌数为1,则你可以将该手牌当做【闪】使用或打出。③若你的装备区牌数为1,则你可以将该装备当做【无懈可击】使用或打出。④若你的判定区牌数为1,则你可以将该延时锦囊牌当做【杀】使用或打出。",
+ recaiwang_hand: "才望",
+ recaiwang_equip: "才望",
+ recaiwang_judge: "才望",
+ yangyan: "杨艳",
+ xuanbei: "选备",
+ xuanbei_info: "①游戏开始时,你从牌堆中获得两张具有应变标签的牌。②每回合限一次。当你使用的具有应变标签的牌结算结束后,你可将此牌对应的所有实体牌交给一名其他角色。",
+ xianwan: "娴婉",
+ xianwan_info: "①当你需要使用【闪】时,若你的武将牌未横置,则你可以横置武将牌并视为使用【闪】。②当你需要使用【杀】时,若你的武将牌横置,则你可以重置武将牌并视为使用【杀】。",
+ yangzhi: "杨芷",
+ wanyi: "婉嫕",
+ wanyi_info: "每回合每项限一次。出牌阶段,你可以将一张具有应变效果的牌当做【逐近弃远】/【出其不意】/【水淹七军】/【洞烛先机】使用。",
+ maihuo: "埋祸",
+ maihuo_info: "①当你成为其他角色使用【杀】的目标后,若此【杀】不为转化牌且有对应的实体牌且其武将牌上没有“祸”且你是此牌的唯一目标,则你可以令此牌对你无效,并将此【杀】置于其武将牌上,称为“祸”。②一名其他角色的出牌阶段开始时,若其武将牌上有“祸”,则其对你使用此“祸”(有距离限制且计入次数限制,若你不是此牌的合法目标,则改为将此“祸”置入弃牌堆)。③当你对有“祸”的其他角色造成伤害后,你移去其“祸”。",
+ xinchang: "辛敞",
+ canmou: "参谋",
+ canmou_info: "一名角色使用普通锦囊牌指定第一个目标时,若其手牌数为全场唯一最多,则你可以为此牌增加一个额外目标。",
+ congjian: "从鉴",
+ congjian_info: "一名其他角色成为普通锦囊牌的唯一目标时,若其体力值为全场唯一最多,则你也可以成为此牌的目标。此牌结算结束后,若你受到过渠道为此牌的伤害,则你摸两张牌。",
+ xuangongzhu: "晋宣公主",
+ gz_xuangongzhu: "宣公主",
+ xuangongzhu_prefix: "晋",
+ gaoling: "高陵",
+ gaoling_info: "隐匿技。当你于回合外明置此武将牌时,你可以令一名角色回复1点体力。",
+ qimei: "齐眉",
+ qimei_info: "准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。",
+ ybzhuiji: "追姬",
+ ybzhuiji_info: "出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。",
+ jin_yanghu: "晋羊祜",
+ jin_yanghu_prefix: "晋",
+ huaiyuan: "怀远",
+ huaiyuanx: "绥",
+ huaiyuan_info: "①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。",
+ chongxin: "崇信",
+ chongxin_info: "出牌阶段限一次,你可重铸一张牌,且令一名有手牌的其他角色也重铸一张牌。",
+ dezhang: "德彰",
+ dezhang_info: "觉醒技。准备阶段,若你没有“绥”,则你减1点体力上限并获得〖卫戍〗。",
+ weishu: "卫戍",
+ weishu_info: "锁定技。①当你于摸牌阶段外不因〖卫戍①〗而摸牌后,你令一名角色摸一张牌。②当你于弃牌阶段外不因〖卫戍②〗而弃置牌后,你弃置一名其他角色的一张牌。",
+ jin_jiachong: "晋贾充",
+ jin_jiachong_prefix: "晋",
+ xiongshu: "凶竖",
+ xiongshu_info: "其他角色的出牌阶段开始时,你可弃置X张牌(X为你本轮内此前已发动过此技能的次数,为0则不弃)并展示其一张手牌,然后你预测“其本阶段内是否会使用与展示牌牌名相同的牌”。此阶段结束时,若你的预测正确,则你对其造成1点伤害;否则你获得展示牌。",
+ jianhui: "奸回",
+ jianhui_info: "锁定技。当你造成伤害后,若受伤角色为A,则你摸一张牌;当你受到伤害后,若伤害来源为A,则A弃置一张牌。(A为除本次伤害外最近一次对你造成过伤害的角色)",
+ xinxuanbei: "选备",
+ xinxuanbei_info: "出牌阶段限一次。你可选择一名其他角色区域内的一张牌。然后其对你使用对应实体牌为此牌的【杀】。然后若此【杀】,未对你造成过伤害,你摸一张牌;对你造成过伤害,你摸两张牌。",
+ xinwanyi: "婉嫕",
+ xinwanyi_info: "①当你使用【杀】或普通锦囊牌指定其他角色为唯一目标后,你可将其的一张牌置于你的武将牌上作为“嫕”。②你不能使用/打出/弃置与“嫕”花色相同的牌。③结束阶段或当你受到伤害后,你令一名角色获得你的一张“嫕”。",
+ jin_guohuai: "郭槐",
+ zhefu: "哲妇",
+ zhefu_info: "当你于回合外使用或打出牌后,你可令一名有手牌的其他角色选择一项:⒈弃置一张名称相同的牌。⒉受到你造成的1点伤害。",
+ yidu: "遗毒",
+ yidu_info: "当你使用的【杀】或伤害性锦囊牌结算结束后,你可以展示一名未受到过渠道为此牌伤害的目标角色的至多三张手牌。若这些牌颜色均相同,则你弃置这些牌。",
+ wangxiang: "王祥",
+ bingxin: "冰心",
+ bingxin_info: "每种牌名每回合限一次。当你需要使用基本牌时,若你的手牌数等于体力值且这些牌的颜色均相同,则你可以摸一张牌,视为使用一张基本牌。",
+ ol_lisu: "OL李肃",
+ ol_lisu_prefix: "OL",
+ qiaoyan: "巧言",
+ qiaoyan_info: "锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。",
+ xianzhu: "献珠",
+ xianzhu_info: "锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择你攻击范围内的一名角色B,视为A对B使用一张【杀】。",
+ chengjichengcui: "成济成倅",
+ oltousui: "透髓",
+ oltousui_info: "你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。",
+ olchuming: "畜鸣",
+ olchuming_info: "锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。",
+};
+
+export default translates;
diff --git a/character/yingbian/voices.js b/character/yingbian/voices.js
new file mode 100644
index 000000000..800b3a600
--- /dev/null
+++ b/character/yingbian/voices.js
@@ -0,0 +1,142 @@
+export default {
+ "#oltousui1": "区区黄口孺帝,能有何作为?",
+ "#oltousui2": "昔年沙场茹血,今欲饮帝血!",
+ "#olchuming1": "明公为何如此待我兄弟?",
+ "#olchuming2": "栖佳木之良禽,其鸣亦哀乎?",
+ "#chengjichengcui:die": "今为贼子贾充所害!",
+ "#bingxin1": "思鸟黄雀至,卧冰鱼自跃。",
+ "#bingxin2": "夜静向寒月,卧冰求鲤鱼。",
+ "#wangxiang:die": "夫生之有死,自然之理也。",
+ "#xiongshu1": "怀志拥权,谁敢不服?",
+ "#xiongshu2": "天下凶凶,由我一人。",
+ "#jianhui1": "一箭之仇,十年不忘!",
+ "#jianhui2": "此仇不报,怨恨难消!",
+ "#jin_jiachong:die": "任元褒,吾与汝势不两立!",
+ "#gaoling1": "天家贵胄,福泽四海。",
+ "#gaoling2": "宣王之女,恩惠八方。",
+ "#qimei1": "辅车相依,比翼双飞。",
+ "#qimei2": "情投意合,相濡以沫。",
+ "#ybzhuiji1": "不过是些微代价罢了。",
+ "#ybzhuiji2": "哼,以为这就能难倒我吗?",
+ "#xuangongzhu:die": "元凯,我去也……",
+ "#canmou1": "兢兢业业,竭心筹划。",
+ "#canmou2": "欲设此法,计谋二人。",
+ "#congjian1": "为人臣属,安可不随?",
+ "#congjian2": "主公有难,吾当从之。",
+ "#xinchang:die": "宪英,救我!",
+ "#wanyi1": "天性婉嫕,易以道御。",
+ "#wanyi2": "婉嫕利珍,为后攸行。",
+ "#maihuo1": "祸根未决,转而滋蔓。",
+ "#maihuo2": "无德之亲,终为祸根。",
+ "#yangzhi:die": "贾氏……构陷……",
+ "#xuanbei1": "博选良家,以充后宫。",
+ "#xuanbei2": "非良家,不可选也。",
+ "#xianwan1": "婉而从物,不竞不争。",
+ "#xianwan2": "娴婉恭谨,重贤加礼。",
+ "#yangyan:die": "一旦殂损,痛悼伤怀……",
+ "#caozhao1": "草诏所宣,密勿从事。",
+ "#caozhao2": "惩恶扬功,四方之纲。",
+ "#olxibing1": "讲信修睦,息兵不功。",
+ "#olxibing2": "天时未至,周武还师。",
+ "#ol_huaxin:die": "死国,甚无谓也!",
+ "#bolan1": "博览群书,融会贯通。",
+ "#bolan2": "博览于文,约之以礼。",
+ "#yifa1": "仪法不明,则实不称名。",
+ "#yifa2": "仪法明晰,则长治久安。",
+ "#zhongyan:die": "嗟尔姜任,邈不我留。",
+ "#zhongyun1": "秉公行事,无所亲疏。",
+ "#zhongyun2": "明晰法理,通晓人情。",
+ "#shenpin1": "考其遗法,肃若神明。",
+ "#shenpin2": "气韵生动,出于天成。",
+ "#weiguan:die": "辞荣善终,不可求……",
+ "#chexuan1": "兵车疾动,以悬敌首!",
+ "#chexuan2": "层层布设,以多胜强!",
+ "#qiangshou": null,
+ "#qiangshou1": null,
+ "#qiangshou2": null,
+ "#cheliji:die": "元气已伤,不如归去……",
+ "#caiwang1": "干虽静退,性乖恒理。",
+ "#caiwang2": "绥怀之称,监守邺城。",
+ "#naxiang1": "奉命伐吴,得胜纳降。",
+ "#naxiang2": "进军逼江,震慑吴贼。",
+ "#simazhou:die": "恩赐重物,病身难消受……",
+ "#qiaoyan": null,
+ "#qiaoyan1": "此事不宜迟,在于速决。",
+ "#qiaoyan2": "公若到彼,贵不可言。",
+ "#xianzhu": null,
+ "#xianzhu1": "馈珠之恩,望将军莫忘。",
+ "#xianzhu2": "愿以珠为礼,与卿交好,而休刀兵。",
+ "#ol_lisu:die": "忘恩负义之徒!",
+ "#huirong": null,
+ "#huirong1": "红尘洗练,慧容不改。",
+ "#huirong2": "花貌易改,福惠长存。",
+ "#ciwei": null,
+ "#ciwei1": "乃家乃邦,是则是效。",
+ "#ciwei2": "其慈有威,不舒不暴。",
+ "#caiyuan": null,
+ "#caiyuan1": "柳絮轻舞,撷芳赋诗。",
+ "#caiyuan2": "秀媛才德,知书达理。",
+ "#jin_yanghuiyu:die": "韶华易老,佳容不再……",
+ "#zhuosheng1": "才经世务,干用之绩。",
+ "#zhuosheng2": "器量之远,当至公辅。",
+ "#shibao:die": "寒门出身,难以擢升。",
+ "#huishi1": "你的想法,我已知晓。",
+ "#huishi2": "妾身慧眼,已看透太多。",
+ "#qingleng1": "冷冷清清,寂落沉沉。",
+ "#qingleng2": "冷月葬情,深雪埋伤。",
+ "#xuanmu1": "四门穆穆,八面莹澈。",
+ "#xuanmu2": "天色澄穆,心明清静。",
+ "#jin_zhangchunhua:die": "冷眸残情,孤苦为一人。",
+ "#buchen1": "螟蛉之光,安敢同日月争辉?",
+ "#buchen2": "巍巍隐帝,岂可为臣?",
+ "#smyyingshi1": "鹰扬千里,明察秋毫。",
+ "#smyyingshi2": "鸢飞戾天,目入百川。",
+ "#xiongzhi1": "烈士雄心,志存高远。",
+ "#xiongzhi2": "乱世之中,唯我司马!",
+ "#quanbian1": "筹权谋变,步步为营。",
+ "#quanbian2": "随机应变,谋国窃权。",
+ "#jin_simayi:die": "虎入骷冢,司马难兴。",
+ "#shiren": null,
+ "#shiren1": "宠过必乱,不可大任。",
+ "#shiren2": "开卷有益,识人有法",
+ "#yanxi": null,
+ "#yanxi1": "宴会嬉趣,其乐融融。",
+ "#yanxi2": "宴中趣玩,得遇知己。",
+ "#jin_wangyuanji:die": "祖父已逝,哀凄悲戚。",
+ "#tuishi1": "此僚怀异,召汝讨贼。",
+ "#tuishi2": "推令既出,焉敢不从?",
+ "#choufa1": "秣马厉兵,筹伐不臣!",
+ "#choufa2": "枕戈待旦,秣马征平。",
+ "#zhaoran1": "行昭然于世,赦众贼以威。",
+ "#zhaoran2": "吾之心思,路人皆知。",
+ "#chengwu": null,
+ "#chengwu1": "令行禁止,政通无虞。",
+ "#chengwu2": "上下一体,大业可筹。",
+ "#jin_simazhao:die": "司马三代,一梦成空……",
+ "#baoqie1": "宝箧藏玺,时局变动。",
+ "#baoqie2": "曹亡宝箧,尽露锋芒。",
+ "#jyishi1": "家庭和顺,夫妻和睦。",
+ "#jyishi2": "之子于归,宜其室家。",
+ "#shiduo1": "鉴识得体,气度雅涵。",
+ "#shiduo2": "宽容体谅,宽人益己。",
+ "#jin_xiahouhui:die": "夫君,你怎么对我如此狠心……",
+ "#taoyin1": "司马氏善谋、善忍,善置汝于绝境!",
+ "#taoyin2": "隐忍数载,亦不坠青云之志!",
+ "#yimie1": "汝大逆不道,当死无赦!",
+ "#yimie2": "斩草除根,灭其退路!",
+ "#ruilve1": "司马当兴,其兴在吾。",
+ "#ruilve2": "吾承父志,故知军事、通谋略。",
+ "#tairan1": "撼山易,撼我司马氏难。",
+ "#tairan2": "云卷云舒,处之泰然。",
+ "#jin_simashi:die": "子上,这是为兄给你打下的江山……",
+ "#xijue1": "承爵于父,安能辱之!",
+ "#xijue2": "虎父安有犬子乎?",
+ "#zhanghuyuechen:die": "儿有辱……父亲威名……",
+ "#sanchen": null,
+ "#sanchen1": "陈书弼国,当一而再、再而三。",
+ "#sanchen2": "勘除弼事,三陈而就。",
+ "#zhaotao": null,
+ "#zhaotao1": "奉诏伐吴,定鼎东南!",
+ "#zhaotao2": "三陈方得诏,一股下孙吴!",
+ "#duyu:die": "金瓯尚缺,死难瞑目……",
+};
diff --git a/game/config.js b/game/config.js
index 88307e503..7f52cea4a 100644
--- a/game/config.js
+++ b/game/config.js
@@ -130,7 +130,7 @@ window.config = {
cards: ["standard", "extra"],
characters: ["standard", "shenhua", "sp", "sp2", "yijiang", "refresh", "xinghuoliaoyuan", "mobile", "extra", "yingbian", "sb", "tw", "offline", "clan", "collab", "xianding", "huicui", "shiji", "jsrg", "onlyOL"],
- moderned_chracters: ["key"],
+ moderned_chracters: ["standard", "shenhua", "sp", "sp2", "yijiang", "refresh", "xinghuoliaoyuan", "mobile", "extra", "yingbian", "sb", "tw", "offline", "clan", "collab", "xianding", "huicui", "shiji", "onlyOL", "jsrg", "old", "diy", "ddd", "key"],
connect_characters: ["diy"],
connect_cards: ["huanlekapai", "guozhan", "sp", "zhulu", "yingbian", "yongjian"],
plays: [],
diff --git a/noname/library/index.js b/noname/library/index.js
index 45e38c623..bb22a84e9 100644
--- a/noname/library/index.js
+++ b/noname/library/index.js
@@ -13675,4 +13675,4 @@ setAllPropertiesEnumerable(lib.element.GameEvent.prototype);
setAllPropertiesEnumerable(lib.element.Dialog.prototype);
setAllPropertiesEnumerable(lib.element.Control.prototype);
setAllPropertiesEnumerable(lib.element.Client.prototype);
-setAllPropertiesEnumerable(lib.element.NodeWS.prototype);
\ No newline at end of file
+setAllPropertiesEnumerable(lib.element.NodeWS.prototype);