From 9ded105187c2e0839244596e7a5e9087ac7d2c55 Mon Sep 17 00:00:00 2001 From: lieren2023 <131325076+lieren2023@users.noreply.github.com> Date: Tue, 7 May 2024 18:39:06 +0800 Subject: [PATCH] Delete character/skill.js --- character/skill.js | 7355 -------------------------------------------- 1 file changed, 7355 deletions(-) delete mode 100644 character/skill.js diff --git a/character/skill.js b/character/skill.js deleted file mode 100644 index f42b068ff..000000000 --- a/character/skill.js +++ /dev/null @@ -1,7355 +0,0 @@ -import { lib, game, ui, get, ai, _status } from "../../noname.js"; - -/** @type { importCharacterConfig['skill'] } */ -const skills = { - //龙起襄樊 - //关羽 - //界界关羽 - dragchaojue: { - trigger: { player: "phaseZhunbeiBegin" }, - filter(event, player) { - if (!game.hasPlayer(target => target != player)) return false; - return player.countCards("h", card => _status.connectMode || lib.filter.cardDiscardable(card, player)); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseToDiscard(get.prompt2("dragchaojue"), "h") - .set("ai", card => { - const player = get.event("player"); - if (!game.hasPlayer(target => get.attitude(player, target) < 0)) return 0; - return 7.5 - get.value(card); - }) - .set("logSkill", "dragchaojue") - .forResult(); - }, - popup: false, - async content(event, trigger, player) { - const targets = game.filterPlayer(target => target != player).sortBySeat(); - if (targets.length) { - const suits = event.cards - .reduce((list, card) => list.add(get.suit(card, player)), []) - .sort((a, b) => { - return lib.suit.indexOf(a) - lib.suit.indexOf(b); - }); - player.line(targets); - for (const i of targets) { - i.addTempSkill("dragchaojue_buff"); - i.markAuto("dragchaojue_buff", suits); - } - for (const target of targets) { - const { - result: { bool }, - } = await target - .chooseToGive( - player, - (card, player) => { - return get.event("suits").includes(get.suit(card)); - }, - "h", - "give" - ) - .set("suits", suits) - .set("ai", card => { - const player = get.event("player"), - target = get.event().getParent().player; - const att = get.attitude(player, target); - if (att > 0) return 7.5 - get.value(card); - if (att == 0 && get.attitude(target, player) == 0) return 0; - if ( - att < 0 && - get.attitude(target, player) < 0 && - player.getSkills(null, false, false).some(skill => { - if (get.is.locked(skill, player)) return false; - const info = get.info(skill); - return info && info.ai && (info.ai.maixie || info.ai.maixie_hp || info.ai.maixie_defend); - }) && - player.getHp() > 2 - ) - return 0; - return 7.5 - get.value(card); - }) - .set("prompt", "超绝:交给" + get.translation(player) + "一张" + get.translation(suits) + "手牌,或本回合非锁定技失效"); - if (!bool) target.addTempSkill("fengyin"); - } - } - }, - subSkill: { - buff: { - onremove: true, - charlotte: true, - mod: { - cardEnabled2(card, player) { - if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; - }, - }, - marktext: "绝", - intro: { content: "本回合内不能使用或打出$牌" }, - }, - }, - }, - dragjunshen: { - mod: { - targetInRange(card, player) { - if (get.suit(card) == "diamond" && card.name == "sha") return true; - }, - }, - locked: false, - enable: ["chooseToUse", "chooseToRespond"], - filterCard(card, player) { - return get.color(card) == "red"; - }, - viewAsFilter(player) { - return player.countCards("hes", { color: "red" }); - }, - position: "hes", - viewAs: { name: "sha" }, - prompt: "将一张红色牌当作【杀】使用或打出", - check(card) { - const val = get.value(card); - if (_status.event.name == "chooseToRespond") return 1 / Math.max(0.1, val); - return 5 - val; - }, - ai: { - order(item, player) { - if (!player || !_status.event.type || _status.event.type != "phase") { - return 0.1; - } - return get.order({ name: "sha" }, player) + 0.3; - }, - respondSha: true, - skillTagFilter(player) { - if (!player.countCards("hes", { color: "red" })) return false; - }, - }, - group: ["dragjunshen_add", "dragjunshen_damage"], - subSkill: { - add: { - trigger: { player: "useCard2" }, - filter(event, player) { - if (event.card.name != "sha" || get.suit(event.card) != "heart") return false; - return game.hasPlayer(target => { - return target != player && !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target) && lib.filter.targetInRange(event.card, player, target); - }); - }, - async cost(event, trigger, player) { - event.result = await player - .chooseTarget(get.prompt("dragjunshen_add"), "为" + get.translation(trigger.card) + "额外指定一个目标", (card, player, target) => { - const evt = get.event().getTrigger(); - return target != player && !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target) && lib.filter.targetInRange(evt.card, player, target); - }) - .set("ai", target => get.effect(target, _status.event.getTrigger().card, _status.event.player)) - .forResult(); - }, - content() { - trigger.targets.addArray(event.targets); - }, - }, - damage: { - trigger: { source: "damageBegin1" }, - filter(event, player) { - const evt = event.getParent(2); - return evt.name == "useCard" && evt.skill == "dragjunshen"; - }, - logTarget: "player", - prompt2(event, player) { - return "令" + get.translation(event.player) + "选择弃置装备区所有牌或令此伤害+1"; - }, - async content(event, trigger, player) { - const target = trigger.player; - let result; - if (!target.countDiscardableCards(target, "e")) result = { index: 1 }; - else - result = await target - .chooseControl() - .set("choiceList", ["弃置装备区所有牌", "令此伤害+1"]) - .set("ai", () => { - const player = get.event("player"), - trigger = get.event().getTrigger(); - if ( - player.getHp() <= 2 || - player.getDiscardableCards(player, "e").reduce((sum, card) => { - return sum + get.value(card, player); - }, 0) < 7 - ) - return 0; - return 1; - }) - .forResult(); - if (result.index == 0) { - await target.discard(target.getDiscardableCards(target, "e")); - } else trigger.increase("num"); - }, - }, - }, - }, - //龙曹仁 - draglizhong: { - trigger: { player: "phaseJieshuBegin" }, - async cost(event, trigger, player) { - let choiceList = ["将任意张装备牌至于任意名角色的装备区", "令你或任意名装备区里有牌的角色摸一张牌"], - choices = ["置入装备", "团体摸牌", "cancel2"]; - if ( - !player.countCards("he", card => { - if (get.type(card) != "equip") return false; - return game.hasPlayer(target => { - return target.canEquip(card); - }); - }) - ) { - choices.shift(); - choiceList[0] = '' + choiceList[0] + ""; - } - const { - result: { control }, - } = await player - .chooseControl(choices) - .set("prompt", "###" + get.prompt("draglizhong") + "###选择首先执行的一项") - .set("choiceList", choiceList) - .set("ai", () => { - return get.event("controls")[0]; - }); - event.result = { bool: control != "cancel2", cost_data: control }; - }, - async content(event, trigger, player) { - let choices = ["置入装备", "团体摸牌"], - used = false; - if (event.cost_data == "团体摸牌") choices.reverse(); - choices.push(event.cost_data); - for (let i = 1; i <= 3; i++) { - if (i == 3 && used) break; - switch (choices[i - 1]) { - case "置入装备": { - while ( - player.hasCard(card => { - if (get.type(card) != "equip") return false; - return game.hasPlayer(target => { - return target.canEquip(card); - }); - }, "he") - ) { - const { - result: { bool, cards, targets }, - } = await player.chooseCardTarget({ - prompt: "厉战:将一张装备牌置于一名角色的装备区", - filterCard(card) { - return get.type(card) == "equip"; - }, - position: "he", - filterTarget(card, player, target) { - return target.canEquip(card); - }, - ai1(card) { - return 6 - get.value(card); - }, - ai2(target) { - const player = get.event("player"); - const att = get.attitude(player, target); - if (att <= 0 || target.countCards("e")) return 0; - return att * (target == player ? 1 : 3); - }, - }); - if (bool) { - if (i == 1 && !used) used = true; - const card = cards[0], - target = targets[0]; - player.line(target); - if (target != player) { - player.$give(card, target, false); - } - await game.asyncDelay(0.5); - await target.equip(card); - } else break; - } - break; - } - case "团体摸牌": { - const { result } = await player - .chooseTarget( - "厉战:令你或任意名装备区有牌的角色摸一张牌", - (card, player, target) => { - if (target != player && !target.countCards("e")) return false; - if (ui.selected.targets.length) { - const choose = ui.selected.targets[0]; - if (choose == player && !player.countCards("e")) return false; - } - return true; - }, - [1, Infinity] - ) - .set("multitarget", true) - .set("complexTarget", true) - .set("ai", target => { - const player = get.event("player"); - if (!player.countCards("e")) { - if ( - game.countPlayer(choose => { - return choose.countCards("e") && get.attitude(player, choose) > 0; - }) > 1 && - target == player - ) - return 0; - } - return get.attitude(player, target); - }); - if (result.bool) { - if (i == 1 && !used) used = true; - const targets = result.targets.sortBySeat(); - player.line(targets); - choices.addArray(targets); - for (let j = 0; j < targets.length; j++) { - await targets[j].draw("nodelay"); - } - await game.asyncDelayx(); - } - break; - } - } - } - choices = choices.slice(3); - if (choices.length) { - choices.sortBySeat(); - player.line(choices); - for (const target of choices) { - target.addTempSkill("draglizhong_effect", "roundStart"); - } - await game.asyncDelayx(); - } - }, - subSkill: { - effect: { - charlotte: true, - mod: { - maxHandcard(player, num) { - return num + 2; - }, - }, - enable: "chooseToUse", - filterCard: true, - position: "e", - viewAs: { name: "wuxie" }, - filter(event, player) { - return player.countCards("e") > 0; - }, - viewAsFilter(player) { - return player.countCards("e") > 0; - }, - prompt: "将一张装备区的牌当作【无懈可击】使用", - check(card) { - return 8 - get.equipValue(card); - }, - mark: true, - marktext: "守", - intro: { content: "手牌上限+2,可将装备区的牌当作【无懈可击】使用" }, - }, - }, - }, - //撅碎(难视 - dragjuesui: { - trigger: { global: "dying" }, - filter(event, player) { - return !player.getStorage("dragjuesui").includes(event.player) && event.player.hasEnabledSlot(); - }, - check(event, player) { - const target = event.player; - if (get.attitude(player, target) <= 0) return false; - return player.countCards("hs", card => player.canSaveCard(card, target)) + target.countCards("hs", card => target.canSaveCard(card, target)) < 1 - target.hp; - }, - logTarget: "player", - async content(event, trigger, player) { - const target = trigger.player; - player.markAuto("dragjuesui", [target]); - const { - result: { bool }, - } = await target.chooseBool("是否将体力值回复至1点并废除装备栏?"); - if (bool) { - await target.recoverTo(1); - let disables = []; - for (let i = 1; i <= 5; i++) { - for (let j = 0; j < target.countEnabledSlot(i); j++) { - disables.push(i); - } - } - if (disables.length) await target.disableEquip(disables); - target.addSkill("dragjuesui_wusheng"); - } else { - target.chat("拒绝!"); - } - }, - init(player) { - if (player.getStorage("dragjuesui").length) { - player.markSkill("dragjuesui"); - } - }, - intro: { content: "已对$发动过此技能" }, - subSkill: { - wusheng: { - charlotte: true, - mark: true, - marktext: "碎", - intro: { content: "殊死一搏!可将黑色非基本牌当作无次数限制的【杀】使用" }, - mod: { - cardUsable(card, player, num) { - if (card.storage && card.storage.dragjuesui) return Infinity; - }, - }, - enable: ["chooseToUse", "chooseToRespond"], - filterCard(card, player) { - return get.color(card) == "black" && get.type(card) != "basic"; - }, - position: "hse", - viewAs: { name: "sha", storage: { dragjuesui: true } }, - viewAsFilter(player) { - if ( - !player.countCards("hes", card => { - return get.color(card) == "black" && get.type(card) != "basic"; - }) - ) - return false; - }, - prompt: "将一张黑色非基本牌当作无次数限制的【杀】使用或打出", - check(card) { - return 7 - get.value(card); - }, - ai: { - order(item, player) { - if (!player || !_status.event.type || _status.event.type != "phase") { - return 0.1; - } - return get.order({ name: "sha" }, player) * 0.99; - }, - respondSha: true, - skillTagFilter(player) { - if ( - !player.countCards("hes", card => { - return get.color(card) == "black" && get.type(card) != "basic"; - }) - ) - return false; - }, - }, - }, - }, - }, - //吕常×SP淳于琼√ - dragjuwu: { - trigger: { target: "shaBefore" }, - filter(event, player) { - return !game.hasNature(event.card) && game.countPlayer(target => event.player.inRange(target)) >= 3; - }, - forced: true, - content() { - trigger.cancel(); - }, - ai: { - effect: { - target(card, player, target) { - if (card.name == "sha" && !game.hasNature(card) && game.countPlayer(targetx => player.inRange(targetx)) >= 3) return "zerotarget"; - }, - }, - }, - }, - dragshouxiang: { - trigger: { player: "phaseDrawBegin2" }, - filter(event, player) { - if (!game.hasPlayer(target => target.inRange(player))) return false; - return !event.numFixed; - }, - check(event, player) { - if (player.skipList.includes("phaseUse")) return true; - return ( - player.countCards("h") + - event.num + - Math.min( - 5, - game.countPlayer(target => { - return target.inRange(player); - }) - ) - - game.countPlayer(target => { - return target != player && get.attitude(player, target) > 0; - }) <= - player.getHandcardLimit() - ); - }, - content() { - trigger.num += Math.min( - 5, - game.countPlayer(target => target.inRange(player)) - ); - player.skip("phaseUse"); - player.addTempSkill("dragshouxiang_effect"); - }, - subSkill: { - effect: { - charlotte: true, - trigger: { player: "phaseDiscardBegin" }, - filter(event, player) { - return game.hasPlayer(target => target.inRange(player)); - }, - forced: true, - async content(event, trigger, player) { - const num = Math.min( - 5, - game.countPlayer(target => target.inRange(player)) - ); - if (num) { - if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); - let list = []; - while ( - num - list.length > 0 && - player.hasCard(card => { - return !list.some(list => list[1] == card); - }, "h") && - game.hasPlayer(target => { - return target != player && !list.some(list => list[0] == target); - }) - ) { - const { - result: { bool, targets, cards }, - } = await player - .chooseCardTarget({ - prompt: "守襄:你可以交给任意名角色各一张手牌", - prompt2: "(还可分配" + (num - list.length) + "张)", - position: "h", - animate: false, - filterCard(card, player) { - return !get.event("list").some(list => list[1] == card); - }, - filterTarget(card, player, target) { - return target != player && !get.event("list").some(list => list[0] == target); - }, - ai1(card) { - if (card.name == "shan") return 1; - return Math.random(); - }, - ai2(target) { - return get.attitude(get.event("player"), target); - }, - }) - .set("list", list); - if (bool) { - list.push([targets[0], cards[0]]); - player.addGaintag(cards, "olsujian_given"); - } else break; - } - if (_status.connectMode) { - game.broadcastAll(() => { - delete _status.noclearcountdown; - game.stopCountChoose(); - }); - } - if (list.length) { - await game - .loseAsync({ - gain_list: list, - player: player, - cards: list.slice().map(list => list[1]), - giver: player, - animate: "giveAuto", - }) - .setContent("gaincardMultiple"); - } - } - }, - }, - }, - }, - //天书乱斗虚拟偶像线下化 - //小杀 - vtbguisha: { - audio: 1, - trigger: { global: "useCard" }, - direct: true, - shaRelated: true, - filter: function (event, player) { - return event.player != player && event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing(); - }, - content: function () { - "step 0"; - var go = false, - d1 = false; - if (get.attitude(player, trigger.player) > 0) { - d1 = true; - if (trigger.player.hasSkill("jueqing") || trigger.player.hasSkill("gangzhi")) d1 = false; - for (var target of trigger.targets) { - if ( - !target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) || - trigger.player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: trigger.card, - }, - true - ) - ) { - if (!target.hasSkill("gangzhi")) d1 = false; - if ( - target.hasSkillTag("filterDamage", null, { - player: trigger.player, - card: trigger.card, - }) || - get.attitude(player, target) >= 0 - ) - d1 = false; - } - } - 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; - } - } - } - } - go = go * Math.random() + d1 * Math.random() > 0.4; - //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("vtbguisha"), "弃置一张牌,令" + get.translation(trigger.player) + "本次使用的【杀】不计入使用次数,且对" + get.translation(trigger.targets) + "造成的伤害+1", "he"); - next.logSkill = ["vtbguisha", 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--; - } - trigger.player.addTempSkill("vtbguisha_bonus"); - if (!trigger.card.storage) trigger.card.storage = {}; - trigger.card.storage.vtbguisha_targets = trigger.targets; - } - }, - ai: { - expose: 0.2, - }, - subSkill: { - bonus: { - trigger: { - source: "damageBegin1", - }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.card.storage && event.card.storage.vtbguisha_targets && event.card.storage.vtbguisha_targets.includes(event.player); - }, - content: function () { - trigger.num++; - }, - }, - }, - }, - vtbshuli: { - audio: 1, - trigger: { - global: "damageSource", - }, - usable: 2, - filter: function (event, player) { - return event.source && event.source != player && event.card && event.card.name == "sha" && event.source.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.source) >= 0 || (get.attitude(player, event.source) >= -4 && get.distance(_status.currentPhase, player, "absolute") > get.distance(_status.currentPhase, event.source, "absolute")); - }, - content: function () { - "step 0"; - var drawers = [trigger.source, player].sortBySeat(_status.currentPhase); - game.asyncDraw(drawers); - }, - }, - //小闪 - vtbshanwu: { - audio: 1, - trigger: { - global: "useCardToTarget", - }, - filter: function (event, player) { - return ( - event.card.name == "sha" && - event.target != player && - event.isFirstTarget && - player.hasCard(card => { - return get.name(card) == "shan" || _status.connectMode; - }) - ); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt("vtbshanwu"), "弃置一张【闪】,取消此【杀】对" + get.translation(trigger.targets) + "的目标", { name: "shan" }) - .set("logSkill", "vtbshanwu") - .set("ai", card => { - if (_status.event.goon) return 6 - get.value(card); - return 0; - }) - .set( - "goon", - (function () { - var effect = 0; - for (var target of trigger.targets) { - var eff = get.effect(target, trigger.card, trigger.player, player); - if ( - !target.mayHaveShan( - player, - "use", - target.getCards("h", i => { - return i.hasGaintag("sha_notshan"); - }) - ) || - trigger.player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: trigger.card, - }, - true - ) - ) { - eff *= 1.25; - } - if (target.hp <= 2) eff *= 1.1; - effect += eff; - } - return effect < 0; - })() - ); - "step 1"; - if (result.bool) { - game.log(player, "取消了", trigger.card, "的所有目标"); - trigger.targets.length = 0; - trigger.getParent().triggeredTargets2.length = 0; - trigger.untrigger(); - } - }, - ai: { - expose: 0.2, - }, - }, - vtbxianli: { - audio: 1, - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - usable: 2, - filter: function (event, player) { - if (!_status.currentPhase || !_status.currentPhase.isIn() || !_status.currentPhase.countGainableCards(player, "he")) return false; - var evt = event.getl(player); - return ( - evt && - evt.cards2 && - evt.cards2.some(card => { - return get.name(card, false) == "shan"; - }) - ); - }, - check: function (event, player) { - return get.effect(_status.currentPhase, { name: "shunshou_copy2" }, player, player) > 0; - }, - prompt2: function (event, player) { - return "获得" + get.translation(_status.currentPhase) + "的一张牌"; - }, - logTarget: () => _status.currentPhase, - content: function () { - "step 0"; - player.gainPlayerCard(_status.currentPhase, "he", true); - }, - ai: { - expose: 0.15, - }, - }, - //小桃 - vtbtaoyan: { - audio: 1, - trigger: { - player: "phaseBegin", - }, - direct: true, - content: function () { - "step 0"; - if (!_status.vtbtaoyan_count) { - _status.vtbtaoyan_count = 5; - } - player.chooseTarget(get.prompt("vtbtaoyan"), "令一或两名其他角色摸一张牌并从游戏外获得一张【桃】(♥6)", lib.filter.notMe, [1, 2]).set("ai", target => { - var player = _status.event.player; - return get.recoverEffect(target, player, player) / 2 + get.attitude(player, target); - }); - "step 1"; - if (result.bool) { - var targets = result.targets.slice(); - targets.sortBySeat(); - player.logSkill("vtbtaoyan", targets); - game.broadcastAll(function () { - if (!lib.inpile.includes("tao")) { - lib.inpile.add("tao"); - } - }); - player.addSkill("vtbtaoyan_remove"); - for (var target of targets) { - target.draw(); - if (!_status.vtbtaoyan_count) continue; - if (!_status.vtbtaoyan_cards) _status.vtbtaoyan_cards = []; - _status.vtbtaoyan_count--; - var card = game.createCard("tao", "heart", 6); - _status.vtbtaoyan_cards.push(card.cardid); - target.gain(card, "gain2"); - } - } - }, - ai: { - expose: 0.3, - threaten: 3.2, - }, - subSkill: { - remove: { - trigger: { - global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], - }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - forceDie: true, - filter: function (event, player) { - if (typeof _status.vtbtaoyan_count != "number") return false; - var cards = event.getd(); - return cards.some(card => { - return _status.vtbtaoyan_cards.includes(card.cardid); - }); - }, - content: function () { - var cards = trigger.getd(), - remove = []; - for (var card of cards) { - if (_status.vtbtaoyan_cards.includes(card.cardid)) { - _status.vtbtaoyan_cards.remove(card.cardid); - remove.push(card); - } - } - if (remove.length) { - remove.forEach(i => { - i.remove(); - _status.vtbtaoyan_count++; - }); - game.log(remove, "被移出了游戏"); - } - }, - }, - }, - }, - vtbyanli: { - audio: 1, - trigger: { - global: "dying", - }, - filter: function (event, player) { - if (player.hasSkill("vtbyanli_used")) return false; - if (_status.currentPhase == player) return false; - return event.player.hp <= 0; - }, - check: function (event, player) { - return get.recoverEffect(event.player, player, player) > 0; - }, - content: function () { - "step 0"; - player.addTempSkill("vtbyanli_used", "roundStart"); - trigger.player.recover(1 - trigger.player.hp); - trigger.player.draw(); - }, - subSkill: { - used: { - charlotte: true, - }, - }, - }, - //小乐 - vtbleyu: { - audio: 1, - trigger: { - global: "phaseBegin", - }, - direct: true, - filter: function (event, player) { - return player.countCards("he") >= 3; - }, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt2("vtbleyu", trigger.player), 3, "he") - .set("ai", card => { - if (ui.selected.cards.length == 2) return 10 - get.value(card); - if (_status.event.effect > 0) { - return 6 - get.value(card); - } - return 0; - }) - .set("effect", trigger.player.hasJudge("lebu") ? 0 : get.effect(trigger.player, { name: "lebu" }, player, player)) - .set("logSkill", ["vtbleyu", trigger.player]); - "step 1"; - if (result.bool) { - trigger.player.judge(lib.card.lebu.judge).judge2 = lib.card.lebu.judge2; - } else event.finish(); - "step 2"; - if (!result.bool) { - trigger.player.skip("phaseUse"); - } - }, - ai: { - expose: 0.3, - threaten: 2.9, - }, - }, - vtbyuanli: { - audio: 1, - trigger: { global: ["phaseUseSkipped", "phaseUseCancelled"] }, - direct: true, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("vtbyuanli"), lib.filter.notMe).set("ai", target => get.attitude(_status.event.player, target) + 1); - "step 1"; - if (result.bool) { - player.logSkill("vtbyuanli", result.targets[0]); - game.asyncDraw([player, result.targets[0]].sortBySeat(_status.currentPhase)); - } - }, - ai: { - expose: 0.1, - }, - }, - vtbmeiniang: { - audio: 1, - trigger: { global: "phaseUseBegin" }, - filter: function (event, player) { - return event.player != player; - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0 && event.player.getUseValue("jiu") >= 0; - }, - logTarget: "player", - content: function () { - trigger.player.chooseUseTarget("jiu", true, false); - }, - }, - vtbyaoli: { - audio: 1, - trigger: { global: "useCardAfter" }, - filter: function (event, player) { - return event.card.name == "jiu" && event.player != player && event.player.isPhaseUsing(); - }, - logTarget: "player", - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - content: function () { - trigger.player.addTempSkill("vtbyaoli_effect"); - trigger.player.addMark("vtbyaoli_effect", 1, false); - }, - ai: { - expose: 0.15, - }, - subSkill: { - effect: { - audio: "vtbyaoli", - charlotte: true, - trigger: { player: "useCard2" }, - forced: true, - popup: false, - onremove: true, - nopop: true, - filter: function (event, player) { - return event.card.name == "sha" && player.countMark("vtbyaoli_effect") > 0; - }, - content: function () { - "step 0"; - trigger.directHit.addArray(game.filterPlayer()); - var num = player.countMark("vtbyaoli_effect"); - if ( - !game.hasPlayer(current => { - return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, player, current); - }) - ) - event.finish(); - else - player - .chooseTarget("媱丽:是否为" + get.translation(trigger.card) + "额外指定" + (num > 1 ? "至多" : "") + get.cnNumber(num) + "个目标?", num == 1 ? 1 : [1, num], (card, player, target) => { - return !_status.event.sourcex.includes(target) && player.canUse(_status.event.card, target); - }) - .set("sourcex", trigger.targets) - .set("ai", target => { - var player = _status.event.player; - return get.effect(target, _status.event.card, player, player); - }) - .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"; - player.logSkill("vtbyaoli_effect", event.targets); - trigger.targets.addArray(event.targets); - player.removeSkill("vtbyaoli_effect"); - }, - marktext: "媱", - intro: { - content: "下一张【杀】不可被响应且可以额外指定&个目标", - }, - ai: { - directHit_ai: true, - skillTagFilter: function (player, tag, arg) { - return arg.card.name == "sha"; - }, - }, - }, - }, - }, - //官盗S特015神马超 - psshouli: { - audio: "shouli", - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - if (player != _status.currentPhase && (name == "sha" || name == "shan")) return true; - }, - filter: function (event, player) { - if (event.responded || event.psshouli || event.type == "wuxie") return false; - if ( - game.hasPlayer(function (current) { - return current.getEquips(4).length > 0; - }) && - event.filterCard( - get.autoViewAs( - { - name: "sha", - storage: { psshouli: true }, - }, - "unsure" - ), - player, - event - ) - ) - return true; - if ( - game.hasPlayer(function (current) { - return current.getEquips(3).length > 0; - }) && - event.filterCard( - get.autoViewAs( - { - name: "shan", - storage: { psshouli: true }, - }, - "unsure" - ), - player, - event - ) - ) - return true; - return false; - }, - delay: false, - locked: true, - filterTarget: function (card, player, target) { - var event = _status.event, - evt = event; - if (event._backup) evt = event._backup; - var equip3 = target.getCards("e", card => get.is.defendingMount(card, false)); - var equip4 = target.getCards("e", card => get.is.attackingMount(card, false)); - if ( - equip3.length && - equip3.some(card => - evt.filterCard( - get.autoViewAs( - { - name: "shan", - storage: { psshouli: true }, - }, - [card] - ), - player, - event - ) - ) - ) - return true; - return equip4.some(card => { - var sha = get.autoViewAs( - { - name: "sha", - storage: { psshouli: true }, - }, - [card] - ); - if (evt.filterCard(sha, player, event)) { - if (!evt.filterTarget) return true; - return game.hasPlayer(function (current) { - return evt.filterTarget(sha, player, current); - }); - } - }); - }, - prompt: "将场上的一张坐骑牌当做【杀】或【闪】使用或打出", - content: function () { - "step 0"; - var evt = event.getParent(2); - evt.set("psshouli", true); - var list = []; - var equip3 = target.getCards("e", card => get.is.defendingMount(card, false)); - var equip4 = target.getCards("e", card => get.is.attackingMount(card, false)); - var backupx = _status.event; - _status.event = evt; - try { - if ( - equip3.length && - equip3.some(card => { - var shan = get.autoViewAs( - { - name: "shan", - storage: { psshouli: true }, - }, - [card] - ); - if (evt.filterCard(shan, player, event)) return true; - return false; - }) - ) { - list.push("shan"); - } - if ( - equip4.length && - equip4.some(card => { - var sha = get.autoViewAs( - { - name: "sha", - storage: { psshouli: true }, - }, - [card] - ); - if ( - evt.filterCard(sha, player, evt) && - (!evt.filterTarget || - game.hasPlayer(function (current) { - return evt.filterTarget(sha, player, current); - })) - ) - return true; - return false; - }) - ) { - list.push("sha"); - } - } catch (e) { - game.print(e); - } - _status.event = backupx; - if (list.length == 1) { - event.cardName = list[0]; - var cards = list[0] == "shan" ? equip3 : equip4; - if (cards.length == 1) - event._result = { - bool: true, - links: [cards[0]], - }; - else - player - .choosePlayerCard(true, target, "e") - .set("filterButton", function (button) { - return _status.event.cards.includes(button.link); - }) - .set("cards", cards); - } else - player.choosePlayerCard(true, target, "e").set("filterButton", function (button) { - var card = button.link; - return get.is.attackingMount(card) || get.is.defendingMount(card); - }); - "step 1"; - var evt = event.getParent(2); - if (result.bool && result.links && result.links.length) { - var name = event.cardName || (get.is.attackingMount(result.links[0]) ? "sha" : "shan"); - if (evt.name == "chooseToUse") { - game.broadcastAll( - function (result, name) { - lib.skill.psshouli_backup.viewAs = { - name: name, - cards: [result], - storage: { psshouli: true }, - }; - lib.skill.psshouli_backup.prompt = "选择" + get.translation(name) + "(" + get.translation(result) + ")的目标"; - }, - result.links[0], - name - ); - evt.set("_backupevent", "psshouli_backup"); - evt.backup("psshouli_backup"); - evt.set("openskilldialog", "选择" + get.translation(name) + "(" + get.translation(result.links[0]) + ")的目标"); - evt.set("norestore", true); - evt.set("custom", { - add: {}, - replace: { window: function () {} }, - }); - } else { - delete evt.result.skill; - delete evt.result.used; - evt.result.card = get.autoViewAs( - { - name: name, - cards: [result.links[0]], - storage: { psshouli: true }, - }, - result.links - ); - evt.result.cards = [result.links[0]]; - target.$give(result.links[0], player, false); - if (player != target) target.addTempSkill("fengyin"); - target.addTempSkill("psshouli_thunder"); - player.addTempSkill("psshouli_thunder"); - evt.redo(); - return; - } - } - evt.goto(0); - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player, tag) { - var func = get.is[tag == "respondSha" ? "attackingMount" : "defendingMount"]; - return game.hasPlayer(function (current) { - return current.hasCard(card => func(card, false), "e"); - }); - }, - order: 2, - result: { - player: function (player, target) { - var att = Math.max(8, get.attitude(player, target)); - if (_status.event.type != "phase") return 9 - att; - if (!player.hasValueTarget({ name: "sha" })) return 0; - return 9 - att; - }, - }, - }, - group: "psshouli_init", - subSkill: { - thunder: { - charlotte: true, - trigger: { player: "damageBegin1" }, - forced: true, - mark: true, - content: function () { - trigger.num++; - game.setNature(trigger, "thunder"); - }, - marktext: "⚡", - intro: { - content: "受到的伤害+1且改为雷属性", - }, - ai: { - effect: { - target: (card, player, target) => { - if (!get.tag(card, "damage")) return; - if (target.hasSkillTag("nodamage") || target.hasSkillTag("nothunder")) return "zeroplayertarget"; - if ( - target.hasSkillTag("filterDamage", null, { - player: player, - card: new lib.element.VCard( - { - name: card.name, - nature: "thunder", - }, - [card] - ), - }) - ) - return; - return 2; - }, - }, - }, - }, - init: { - audio: "psshouli", - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - logTarget: () => game.filterPlayer(), - equips: [ - ["heart", 5, "chitu"], - ["diamond", 13, "zixin"], - ["spade", 5, "jueying"], - ["diamond", 13, "hualiu"], - ["club", 5, "dilu"], - ["spade", 13, "dawan"], - ["heart", 13, "zhuahuang"], - ["heart", 3, "jingfanma"], - ], - content: function () { - "step 0"; - event.targets = game.filterPlayer().sortBySeat(_status.firstAct2 || game.zhong || game.zhu || _status.firstAct || player); - event.target = event.targets.shift(); - game.delayx(); - "step 1"; - player.line(target, "green"); - target - .chooseToUse("狩骊:使用一张坐骑牌并摸一张牌,或使用一张坐骑牌指示物", function (card, player, event) { - if (get.subtype(card) != "equip3" && get.subtype(card) != "equip4" && get.subtype(card) != "equip6") return false; - return lib.filter.filterCard.apply(this, arguments); - }) - .set("ai", () => 1); - "step 2"; - if (result.bool) target.draw(); - else { - var cardx = lib.skill.psshouli_init.equips.randomRemove(); - if (!cardx) return; - cardx = { - suit: cardx[0], - number: cardx[1], - name: cardx[2], - }; - var card = game.createCard(cardx); - if (!_status.psshouli_equips) _status.psshouli_equips = []; - _status.psshouli_equips.push(card.cardid); - if (card) { - target.chooseUseTarget(card, true, "nopopup", "noanimate"); - player.addSkill("psshouli_remove"); - } - } - "step 3"; - event.target = event.targets.shift(); - if (event.target) { - event.goto(1); - } - }, - }, - remove: { - trigger: { - global: ["loseAfter", "loseAsyncAfter", "cardsDiscardAfter", "equipAfter"], - }, - forced: true, - charlotte: true, - popup: false, - firstDo: true, - forceDie: true, - filter: function (event, player) { - if (!_status.psshouli_equips || !_status.psshouli_equips.length) return false; - var cards = event.getd(); - return cards.filter(i => _status.psshouli_equips.includes(i.cardid)).length; - }, - content: function () { - var cards = trigger.getd(), - remove = []; - for (var card of cards) { - if (_status.psshouli_equips.includes(card.cardid)) { - _status.psshouli_equips.remove(card.cardid); - remove.push(card); - } - } - if (remove.length) { - game.cardsGotoSpecial(remove); - lib.skill.psshouli_init.equips.addArray(remove.map(i => [i.suit, i.number, i.name])); - game.log("坐骑指示物", remove, "被移出了游戏"); - } - }, - }, - }, - }, - psshouli_backup: { - sourceSkill: "psshouli", - precontent: function () { - "step 0"; - delete event.result.skill; - event.result._apply_args = { throw: false }; - var cards = event.result.card.cards; - event.result.cards = cards; - var owner = get.owner(cards[0]); - event.target = owner; - owner.$throw(cards[0]); - player.popup(event.result.card.name, "metal"); - game.delayx(); - event.getParent().addCount = false; - "step 1"; - if (player != target) target.addTempSkill("fengyin"); - target.addTempSkill("psshouli_thunder"); - player.addTempSkill("psshouli_thunder"); - }, - filterCard: function () { - return false; - }, - prompt: "请选择【杀】的目标", - selectCard: -1, - }, - pshengwu: { - audio: "hengwu", - mod: { - aiOrder: (player, card, num) => { - if (num > 0 && get.tag(card, "draw") && ui.cardPile.childNodes.length + ui.discardPile.childNodes.length < 20) return 0; - }, - aiValue: (player, card, num) => { - if (num > 0 && card.name === "zhuge") return 20; - }, - aiUseful: (player, card, num) => { - if (num > 0 && card.name === "zhuge") return 10; - }, - }, - trigger: { player: ["useCard", "respond"] }, - direct: true, - locked: false, - filter: function (event, player) { - return game.hasPlayer(i => i.countCards("ej", cardx => get.type(cardx) == "equip" && get.suit(event.card) == get.suit(cardx))); - }, - content: function () { - "step 0"; - var suit = get.suit(trigger.card), - extra = game - .filterPlayer() - .map(i => - i.countCards("ej", cardx => { - return get.type(cardx) == "equip" && get.suit(trigger.card) == get.suit(cardx); - }) - ) - .reduce((p, c) => p + c); - var prompt2 = "弃置任意张" + get.translation(suit) + "手牌,然后摸X张牌(X为你弃置的牌数+" + extra + ")"; - player - .chooseToDiscard("h", [1, player.countCards("h", { suit: suit })], { suit: suit }) - .set("prompt", get.prompt("pshengwu")) - .set("prompt2", prompt2) - .set("ai", card => { - if (_status.event.tie) return 0; - let player = _status.event.player; - if (_status.event.goon) return 12 - get.value(card); - if (player == _status.currentPhase) { - if (["shan", "caochuan", "tao", "wuxie"].includes(card.name)) return 8 - get.value(card); - return 6 - get.value(card); - } - return 5.5 - get.value(card); - }) - .set("goon", player.countCards("h", { suit: suit }) == 1) - .set("tie", extra > ui.cardPile.childNodes.length + ui.discardPile.childNodes.length) - .set("logSkill", "pshengwu"); - "step 1"; - if (result.bool) { - var num = result.cards.length; - player.draw( - num + - game - .filterPlayer() - .map(i => i.countCards("ej", cardx => get.type(cardx) == "equip" && get.suit(trigger.card) == get.suit(cardx))) - .reduce((p, c) => p + c) - ); - } - }, - ai: { - threaten: 100, - reverseEquip: true, - effect: { - player: (card, player, target) => { - if (typeof card !== "object") return; - let suit = get.suit(card); - if ( - !lib.suit.includes(suit) || - player.hasCard(function (i) { - return get.suit(i, player) == suit; - }, "h") - ) - return; - return [ - 1, - game.countPlayer(current => { - return current.countCards("e", card => { - return get.suit(card, current) == suit; - }); - }), - ]; - }, - target: (card, player, target) => { - if ( - card.name === "sha" && - !player.hasSkillTag( - "directHit_ai", - true, - { - target: target, - card: card, - }, - true - ) && - game.hasPlayer(current => { - return current.hasCard(cardx => { - return get.subtype(cardx) === "equip3"; - }, "e"); - }) - ) - return [0, -0.5]; - }, - }, - }, - }, - //战役篇田丰 - gzsuishi: { - audio: "suishi", - preHidden: ["gzsuishi2"], - trigger: { global: "dying" }, - forced: true, - //priority:6.5, - check: function () { - return false; - }, - filter: function (event, player) { - return event.player != player && event.parent.name == "damage" && event.parent.source && event.parent.source.isFriendOf(player); - }, - content: function () { - player.draw(); - }, - ai: { - halfneg: true, - }, - group: "gzsuishi2", - }, - gzsuishi2: { - audio: "suishi", - trigger: { global: "dieAfter" }, - forced: true, - check: function () { - return false; - }, - filter: function (event, player) { - return event.player.isFriendOf(player); - }, - content: function () { - player.loseHp(); - }, - }, - //战役篇孔融 - zymingshi: { - audio: "mingshi", - forced: true, - trigger: { target: "useCardToBefore" }, - priority: 15, - filter: function (event, player) { - if (!player.hasEmptySlot(2)) return false; - if (event.card.name != "sha") return false; - return game.hasNature(event.card); - }, - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target) { - if (card.name === "sha" && game.hasNature(card) && target.hasEmptySlot(2)) return "zeroplayertarget"; - if (get.subtype(card) == "equip2" && target.isEmpty(2)) return [0.6, -0.8]; - }, - }, - }, - }, - //战役篇蒋钦 - zyshangyi: { - audio: "shangyi", - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player != target; - }, - content: function () { - "step 0"; - target.viewHandcards(player); - "step 1"; - if (!target.countCards("h")) event.finish(); - else player.chooseCardButton(target, target.getCards("h")); - "step 2"; - if (result.bool) { - target.discard(result.links[0]); - } - }, - ai: { - order: 11, - result: { - target: function (player, target) { - return -target.countCards("h"); - }, - }, - threaten: 1.1, - }, - }, - //官盗K系列杜预 - pkwuku: { - audio: "spwuku", - trigger: { global: "useCard" }, - forced: true, - preHidden: true, - filter: function (event, player) { - if (get.type(event.card) != "equip") return false; - return player.countMark("pkwuku") < 3; - }, - content: function () { - player.addMark("pkwuku", 1); - }, - marktext: "库", - intro: { - content: "mark", - }, - ai: { - combo: "pksanchen", - threaten: 3.6, - }, - }, - pksanchen: { - audio: "spsanchen", - trigger: { player: "phaseJieshuBegin" }, - forced: true, - juexingji: true, - skillAnimation: true, - animationColor: "gray", - filter: function (event, player) { - return player.countMark("pkwuku") > 2; - }, - content: function () { - player.awakenSkill("pksanchen"); - player.gainMaxHp(); - player.recover(); - player.addSkills("pkmiewu"); - }, - ai: { - combo: "pkwuku", - }, - derivation: "pkmiewu", - }, - pkmiewu: { - audio: "spmiewu", - enable: ["chooseToUse", "chooseToRespond"], - filter: function (event, player) { - if (!player.countMark("pkwuku") || player.hasSkill("pkmiewu2")) return false; - for (var i of lib.inpile) { - var type = get.type(i); - if ((type == "basic" || type == "trick") && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (name == "sha") { - if (event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["基本", "", "sha"]); - for (var nature of lib.inpile_nature) { - if (event.filterCard(get.autoViewAs({ name, nature }, "unsure"), player, event)) list.push(["基本", "", "sha", nature]); - } - } else if (get.type(name) == "trick" && event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["锦囊", "", name]); - else if (get.type(name) == "basic" && event.filterCard(get.autoViewAs({ name }, "unsure"), player, event)) list.push(["基本", "", name]); - } - return ui.create.dialog("灭吴", [list, "vcard"]); - }, - //これ 要らない(そよりん声线) - //filter:function(button,player){ - // return _status.event.getParent().filterCard({name:button.link[2]},player,_status.event.getParent()); - //}, - check: function (button) { - if (_status.event.getParent().type != "phase") return 1; - var player = _status.event.player; - if (["wugu", "zhulu_card", "yiyi", "lulitongxin", "lianjunshengyan", "diaohulishan"].includes(button.link[2])) return 0; - return player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - backup: function (links, player) { - return { - audio: "spmiewu", - filterCard: () => false, - selectCard: -1, - popname: true, - viewAs: { name: links[0][2], nature: links[0][3] }, - precontent: function () { - player.addTempSkill("pkmiewu2"); - player.removeMark("pkwuku", 1); - }, - }; - }, - prompt: function (links, player) { - return "视为使用" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "并摸一张牌"; - }, - }, - hiddenCard: function (player, name) { - if (!lib.inpile.includes(name)) return false; - var type = get.type(name); - return (type == "basic" || type == "trick") && player.countMark("pkwuku") > 0 && !player.hasSkill("pkmiewu2"); - }, - ai: { - combo: "pkwuku", - fireAttack: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player) { - if (!player.countMark("pkwuku") || player.hasSkill("pkmiewu2")) return false; - }, - order: 1, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - }, - pkmiewu2: { - trigger: { player: ["useCardAfter", "respondAfter"] }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - return event.skill == "pkmiewu_backup"; - }, - content: function () { - player.draw(); - }, - }, - pkmiewu_backup: { audio: "pkmiewu" }, - //官盗S系列关羽 - pszhonghun: { - audio: "zhongyi", - trigger: { player: ["useCard", "respond"] }, - filter: function (event, player) { - return get.color(event.card) == "red"; - }, - frequent: true, - content: function () { - "step 0"; - var card = game.cardsGotoOrdering(get.cards()).cards[0]; - event.card = card; - game.updateRoundNumber(); - player.showCards(card, get.translation(player) + "发动了【忠魂】"); - "step 1"; - if (get.color(card) == "red") player.gain(card, "gain2"); - }, - }, - //官盗S系列郭嘉·一版 - psqizuo: { - audio: 2, - trigger: { global: ["damageBegin1", "damageBegin3"] }, - filter: function (event, player, name) { - return (name == "damageBegin1" && event.source && event.source.isIn() && player.inRange(event.source)) || (name == "damageBegin3" && event.player && event.player.isIn() && player.inRange(event.player)); - }, - direct: true, - content: function () { - "step 0"; - var name = event.triggername; - var source = get.translation(trigger.source), - target = get.translation(trigger.player), - num = trigger.num; - var targetx = trigger[name == "damageBegin1" ? "source" : "player"]; - var str = name == "damageBegin1" ? source + "即将对" + target + "造成" + num + "点伤害" : target + "即将受到" + source + "造成的" + num + "点伤害"; - player - .chooseToDiscard(get.prompt("psqizuo", targetx), str + ",是否弃置一张牌并判定,若结果颜色与此牌相同,你可以令此伤害+1或-1?", "he") - .set("ai", card => { - if (_status.event.goon) return 5.25 - get.value(card) + (get.color(card) == get.color(_status.pileTop) ? 0.75 : 0); - return 0; - }) - .set( - "goon", - (function () { - var eff = get.damageEffect(trigger.player, trigger.source, player); - if ( - eff > 5 && - !trigger.player.hasSkillTag("filterDamage", null, { - player: player, - card: trigger.card, - }) - ) - return true; - if (eff < -5) return true; - return false; - })() - ) - .set("logSkill", ["psqizuo", targetx]); - "step 1"; - if (result.bool) { - event.color = get.color(result.cards[0], player); - player.judge(function (card) { - if (get.color(card) == _status.event.getParent("psqizuo").color) return 1; - return 0; - }); - } else event.finish(); - "step 2"; - if (result.bool) { - player - .chooseControl("+1", "-1", "cancel2") - .set("prompt", "是否令此伤害+1或-1?") - .set("ai", () => { - if (_status.event.eff < 0) return 1; - return 0; - }) - .set("eff", get.damageEffect(trigger.player, trigger.source, player)); - } else event.finish(); - "step 3"; - if (result.index == 0) { - trigger.num++; - player.popup(" +1 ", "fire"); - game.log(player, "令此伤害+1"); - } - if (result.index == 1) { - trigger.num--; - player.popup(" -1 ", "water"); - game.log(player, "令此伤害-1"); - } - }, - ai: { - threaten: 0.8, - }, - }, - //官盗S系列郭嘉·二版 - psquanmou: { - audio: 2, - trigger: { - global: "useCardAfter", - }, - direct: true, - filter: function (event, player) { - return get.type2(event.card) == "trick" && event.player != player && event.targets && event.targets.includes(player) && event.cards.filterInD("odj").length && player.countCards("h"); - }, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt("psquanmou"), "弃置一张" + get.translation(get.color(trigger.card)) + "手牌,获得" + get.translation(trigger.cards), "h", (card, player) => { - return get.color(card) == _status.event.color; - }) - .set("ai", card => { - return _status.event.value - get.value(card); - }) - .set("logSkill", "psquanmou") - .set("value", get.value(trigger.cards, player)) - .set("color", get.color(trigger.card)); - "step 1"; - if (result.bool) { - var cards = trigger.cards.filterInD("odj"); - if (cards.filterInD("od").length) player.gain(cards.filterInD("od"), "gain2"); - if (cards.filterInD("j").length) player.gain(cards.filterInD("j"), get.owner(cards.filterInD("j")[0]), "give"); - } - }, - }, - //官盗S赵云·一版 - pshuiqiang: { - audio: 2, - trigger: { player: ["shaMiss", "eventNeutralized"] }, - direct: true, - filter: function (event, player) { - if (!event.card || event.card.name != "sha") return false; - return event.target.isIn() && player.canUse("sha", event.target, false) && (player.hasSha() || (_status.connectMode && player.countCards("h"))); - }, - content: function () { - "step 0"; - player - .chooseToUse( - get.prompt2("pshuiqiang", trigger.target), - function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, - trigger.target, - -1 - ) - .set("addCount", false).logSkill = "pshuiqiang"; - }, - }, - pshuntu: { - audio: 2, - trigger: { source: "damageSource" }, - usable: 1, - filter: function (event, player) { - return event.card && event.card.name == "sha" && event.getParent(2).player == player && event.notLink() && player.isPhaseUsing(); - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToUse( - get.prompt2("pshuntu", trigger.player), - function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, - trigger.player, - -1 - ) - .set("addCount", false).logSkill = "pshuntu"; - "step 1"; - if (!result.bool) player.storage.counttrigger.pshuntu--; - }, - }, - //官盗S赵云·二版 - psqijin: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - filter: function (event, player) { - return !event.numFixed; - }, - content: function () { - "step 0"; - trigger.changeToZero(); - event.cards = get.cards(7); - game.cardsGotoOrdering(event.cards); - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards) { - var str = "七进"; - if (player == game.me && !_status.auto) str += ":获得一种颜色的所有牌"; - var dialog = ui.create.dialog(str, cards); - dialog.videoId = id; - }, - player, - event.videoId, - event.cards - ); - event.time = get.utc(); - game.addVideo("showCards", player, ["七进", get.cardsInfo(event.cards)]); - game.addVideo("delay", null, 2); - "step 1"; - var list = []; - for (var i of cards) list.add(get.color(i, false)); - list.sort(); - var next = player.chooseControl(list); - next.set("ai", function () { - return _status.event.choice; - }).set( - "choice", - (function () { - if (list.length == 0) return list[0]; - var color = list[0]; - var cards1 = cards.filter(i => get.color(i) == color), - cards2 = cards.filter(i => get.color(i) == list[1]); - if (get.value(cards1) * cards1.length > get.value(cards2) * cards2.length) return list[0]; - return list[1]; - })() - ); - "step 2"; - event.color = result.control; - var time = 1000 - (get.utc() - event.time); - if (time > 0) game.delay(0, time); - "step 3"; - game.broadcastAll("closeDialog", event.videoId); - player.gain( - cards.filter(i => get.color(i, false) == event.color), - "gain2" - ); - }, - ai: { - threaten: 1.5, - }, - }, - psqichu: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - hiddenCard: function (player, name) { - if (player != _status.currentPhase && !player.hasSkill("psqichu_used") && get.type(name) == "basic" && lib.inpile.includes(name)) return true; - }, - filter: function (event, player) { - if (event.responded || player == _status.currentPhase || player.hasSkill("psqichu_used")) return false; - for (var i of lib.inpile) { - if (get.type(i) == "basic" && event.filterCard({ name: i }, player, event)) return true; - } - return false; - }, - delay: false, - content: function () { - "step 0"; - player.addTempSkill("psqichu_used"); - var evt = event.getParent(2); - var cards = get.cards(2); - for (var i = cards.length - 1; i >= 0; i--) { - ui.cardPile.insertBefore(cards[i].fix(), ui.cardPile.firstChild); - } - var aozhan = player.hasSkill("aozhan"); - player - .chooseButton(["七出:选择要" + (evt.name == "chooseToUse" ? "使用" : "打出") + "的牌", cards]) - .set("filterButton", function (button) { - return _status.event.cards.includes(button.link); - }) - .set( - "cards", - cards.filter(function (card) { - if (get.type(card) != "basic") return false; - if (aozhan && card.name == "tao") { - return ( - evt.filterCard( - { - name: "sha", - isCard: true, - cards: [card], - }, - evt.player, - evt - ) || - evt.filterCard( - { - name: "shan", - isCard: true, - cards: [card], - }, - evt.player, - evt - ) - ); - } - return evt.filterCard(card, evt.player, evt); - }) - ) - .set("ai", function (button) { - var evt = _status.event.getParent(3); - if (evt && evt.ai) { - var tmp = _status.event; - _status.event = evt; - var result = (evt.ai || event.ai1)(button.link, _status.event.player, evt); - _status.event = tmp; - return result; - } - return 1; - }); - "step 1"; - var evt = event.getParent(2); - if (result.bool && result.links && result.links.length) { - var name = result.links[0].name, - aozhan = player.hasSkill("aozhan") && name == "tao"; - if (aozhan) { - name = evt.filterCard( - { - name: "sha", - isCard: true, - cards: [card], - }, - evt.player, - evt - ) - ? "sha" - : "shan"; - } - if (evt.name == "chooseToUse") { - game.broadcastAll( - function (result, name) { - lib.skill.psqichu_backup.viewAs = { - name: name, - cards: [result], - isCard: true, - }; - lib.skill.psqichu_backup.prompt = "选择" + get.translation(result) + "的目标"; - }, - result.links[0], - name - ); - evt.set("_backupevent", "psqichu_backup"); - evt.backup("psqichu_backup"); - } else { - delete evt.result.skill; - delete evt.result.used; - evt.result.card = get.autoViewAs(result.links[0]); - if (aozhan) evt.result.card.name = name; - evt.result.cards = [result.links[0]]; - evt.redo(); - return; - } - } - evt.goto(0); - }, - ai: { - effect: { - target: function (card, player, target, effect) { - if (target.hasSkill("psqichu_used")) return; - if (get.tag(card, "respondShan")) return 0.7; - if (get.tag(card, "respondSha")) return 0.7; - }, - }, - order: 11, - respondShan: true, - respondSha: true, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - backup: { - precontent: function () { - delete event.result.skill; - var name = event.result.card.name; - event.result.cards = event.result.card.cards; - event.result.card = get.autoViewAs(event.result.cards[0]); - event.result.card.name = name; - }, - filterCard: function () { - return false; - }, - selectCard: -1, - }, - used: { charlotte: true }, - }, - }, - pslongxin: { - audio: 2, - trigger: { player: "phaseJudgeBegin" }, - direct: true, - filter: function (event, player) { - return player.countCards("j") && player.countCards("h"); - }, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt2("pslongxin"), { type: "equip" }, "he") - .set("logSkill", "pslongxin") - .set("ai", card => { - if (_status.event.goon) return 15 - get.value(card); - return 0; - }) - .set( - "goon", - player.hasCard(card => { - var cardj = card.viewAs ? { name: card.viewAs } : card; - return get.effect(player, cardj, player, player) < 0; - }, "j") - ); - "step 1"; - if (result.bool) { - player.discardPlayerCard(player, "j", true); - } - }, - }, - //官盗S周瑜·一版 - psoldshiyin: { - audio: 2, - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - frequent: true, - filter: function (event, player) { - if (player != _status.currentPhase) return false; - return event.getg(player).filter(i => get.owner(i) == player).length > 0; - }, - content: function () { - "step 0"; - player.showCards( - trigger.getg(player).filter(i => get.owner(i) == player), - get.translation(player) + "发动了【识音】" - ); - "step 1"; - var suits = [], - cards = trigger.getg(player).filter(i => get.owner(i) == player); - for (var card of cards) suits.add(get.suit(card, player)); - player.addTempSkill("psoldshiyin_effect"); - if (!player.storage.psoldshiyin_effect) player.storage.psoldshiyin_effect = 0; - player.storage.psoldshiyin_effect = Math.max(player.storage.psoldshiyin_effect, suits.length); - if (suits.length >= 2) player.addMark("psoldshiyin_damage", 1, false); - }, - subSkill: { - effect: { - trigger: { player: "useCard" }, - charlotte: true, - forced: true, - onremove: ["psoldshiyin_effect", "psoldshiyin_damage"], - content: function () { - var num = player.countMark("psoldshiyin_effect"); - if (num >= 1) trigger.directHit.addArray(game.players); - if (num >= 2 && get.tag(trigger.card, "damage")) trigger.baseDamage += player.countMark("psoldshiyin_damage"); - if (num >= 3) player.draw(); - player.removeSkill("psoldshiyin_effect"); - }, - mod: { - aiOrder: function (player, card, num) { - var numx = player.countMark("psoldshiyin_effect"); - if (numx >= 2 && get.tag(card, "damage")) return num + 10; - }, - }, - }, - }, - }, - //官盗S周瑜·二版 - psshiyin: { - audio: 2, - trigger: { - global: "phaseBefore", - player: "enterGame", - }, - forced: true, - locked: false, - direct: true, - group: "psshiyin_change", - filter: function (event, player) { - return event.name != "phase" || game.phaseNumber == 0; - }, - content: function () { - "step 0"; - player.chooseCard(get.prompt("psshiyin"), "将一张手牌置于武将牌上,称为“杂音”牌").set("ai", card => 20 - get.value(card)); - "step 1"; - if (result.bool) { - player.logSkill("psshiyin"); - player.addToExpansion(result.cards, player, "give").gaintag.add("psshiyin"); - } - }, - marktext: "音", - intro: { - name: "杂音", - name2: "杂音", - content: "expansion", - markcount: "expansion", - }, - subSkill: { - change: { - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.getExpansions("psshiyin").length && player.countCards("h"); - }, - content: function () { - "step 0"; - var card = player.getExpansions("psshiyin")[0]; - player - .chooseCard(get.prompt("psshiyin"), "用一张手牌替换“杂音”牌(" + get.translation(card) + ")") - .set("ai", card => { - if (_status.event.suit && get.suit(card) == _status.event.suit) return 8 - get.value(card); - return 0; - }) - .set( - "suit", - (function () { - var suits = lib.suit - .slice() - .map(i => [i, (get.suit(card) == i ? 1 : 0) + player.countCards("h", { suit: i })]) - .filter(i => i[1] > 0); - suits.sort((a, b) => a[1] - b[1]); - if (suits.length > 0) return suits[0][0]; - return null; - })() - ); - "step 1"; - if (result.bool) { - player.logSkill("psshiyin"); - player.addToExpansion(result.cards[0], "give", player).gaintag.add("psshiyin"); - var card = player.getExpansions("psshiyin")[0]; - if (card) player.gain(card, "gain2"); - } - }, - }, - }, - }, - psquwu: { - audio: 2, - forced: true, - trigger: { target: "useCardToBefore" }, - filter: function (event, player) { - return player.getExpansions("psshiyin").length && get.suit(player.getExpansions("psshiyin")[0]) == get.suit(event.card); - }, - content: function () { - trigger.cancel(); - }, - ai: { - threaten: 1.1, - combo: "psshiyin", - effect: { - target: function (card, player, target, current) { - var list = target.getExpansions("psshiyin"); - for (var cardx of list) { - if (get.suit(cardx) == get.suit(card)) return "zeroplayertarget"; - } - }, - }, - }, - mod: { - cardEnabled2: function (card, player) { - var list = player.getExpansions("psshiyin"); - for (var cardx of list) { - if (get.suit(cardx) == get.suit(card)) return false; - } - }, - cardRespondable: function (card, player) { - var list = player.getExpansions("psshiyin"); - for (var cardx of list) { - if (get.suit(cardx) == get.suit(card)) return false; - } - }, - cardSavable: function (card, player) { - var list = player.getExpansions("psshiyin"); - for (var cardx of list) { - if (get.suit(cardx) == get.suit(card)) return false; - } - }, - }, - }, - psliaozou: { - audio: 2, - enable: "phaseUse", - locked: false, - filter: function (event, player) { - return !player.hasSkill("psliaozou_blocker", null, null, false) && player.getExpansions("psshiyin").length > 0; - }, - content: function () { - "step 0"; - player.showHandcards(get.translation(player) + "发动了【聊奏】"); - "step 1"; - var cards = player.getExpansions("psshiyin"), - bool = true; - for (var card of cards) { - var suit = get.suit(card); - if (player.hasCard(cardx => get.suit(cardx) == suit)) { - bool = false; - break; - } - } - if (bool) player.draw(); - else - player.addTempSkill("psliaozou_blocker", { - player: ["useCard1", "useSkillBegin", "phaseUseEnd"], - }); - }, - subSkill: { - blocker: { charlotte: true }, - }, - mod: { - aiValue: function (player, card, num) { - var suit = get.suit(card); - if (player.isPhaseUsing() && player.getExpansions("psshiyin").some(i => get.suit(i) == suit)) return num / 5; - }, - aiUseful: function () { - return lib.skill.psliaozou.mod.aiValue.apply(this, arguments); - }, - }, - ai: { - combo: "psshiyin", - order: 9.9, - result: { - player: function (player) { - var cards = player.getExpansions("psshiyin"), - bool = true; - for (var card of cards) { - var suit = get.suit(card); - if (player.hasCard(cardx => get.suit(cardx) == suit)) return 0; - } - return 1; - }, - }, - }, - }, - //官盗S武将传晋司马 - psquanyi: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return player.canCompare(target); - }, - group: "psquanyi_tianbian", - content: function () { - "step 0"; - player.chooseToCompare(target, function (card) { - if (typeof card == "string" && lib.skill[card]) { - var ais = - lib.skill[card].check || - function () { - return 0; - }; - return ais(); - } - var player = get.owner(card); - var getn = function (card) { - if (player.hasSkill("tianbian") && get.suit(card) == "heart") return 13; - return get.number(card); - }; - var event = _status.event.getParent(); - var to = player == event.player ? event.target : event.player; - var addi = get.value(card) >= 8 && get.type(card) != "equip" ? -6 : 0; - if (card.name == "du") addi -= 5; - if (get.color(card) == "black") addi -= 6; - if (player == event.player) { - if (event.small) { - return -getn(card) - get.value(card) / 2 + addi; - } - return getn(card) - get.value(card) / 2 + addi; - } else { - if (get.attitude(player, to) <= 0 == Boolean(event.small)) { - return -getn(card) - get.value(card) / 2 + addi; - } - return getn(card) - get.value(card) / 2 + addi; - } - }); - "step 1"; - if (result.tie) event.finish(); - else { - var targets = [player, target]; - if (!result.bool) targets.reverse(); - var suits = [result.player, result.target].map(i => get.suit(i, false)); - event.targets = targets; - event.suits = suits; - } - "step 2"; - if (event.suits.includes("heart")) { - if (targets[1].countGainableCards("hej", targets[0]) > 0) { - targets[0].gainPlayerCard(targets[1], "hej", true); - } - } - "step 3"; - if (event.suits.includes("diamond")) { - targets[1].damage(targets[0]); - } - "step 4"; - if (event.suits.includes("spade")) { - targets[0].loseHp(); - } - "step 5"; - if (event.suits.includes("club")) { - if (targets[0].countDiscardableCards(targets[0], "he")) { - targets[0].chooseToDiscard(2, true, "he"); - } - } - }, - ai: { - order: 6, - result: { - target: -1, - }, - }, - subSkill: { - tianbian: { - audio: "psquanyi", - enable: "chooseCard", - check: function (event) { - var player = _status.event.player; - if (player.hasSkill("smyyingshi")) { - var card = ui.cardPile.childNodes[0]; - if ((get.color(card) == "black" && get.number(card) <= 4) || (get.color(card) == "red" && get.number(card) >= 11)) return 20; - } - return !player.hasCard(function (card) { - var val = get.value(card); - return val < 0 || (get.color(card) == "black" && val <= 4) || (get.color(card) == "red" && get.number(card) >= 11); - }, "h") - ? 20 - : 0; - }, - filter: function (event) { - return event.type == "compare" && !event.directresult; - }, - onCompare: function (player) { - return game.cardsGotoOrdering(get.cards()).cards; - }, - }, - }, - }, - //官盗S曹植 - psliushang: { - audio: 2, - trigger: { player: "phaseDrawBegin1" }, - forced: true, - filter: function (event, player) { - return !event.numFixed; - }, - group: "psliushang_give", - content: function () { - "step 0"; - trigger.changeToZero(); - player.draw(1 + Math.max(3, game.countPlayer())); - event.targets = game.filterPlayer(i => i != player); - "step 1"; - var current = targets.shift(); - if (!player.countCards("h")) event.finish(); - else - player.chooseCardTarget({ - prompt: "流殇:将一张牌置于" + get.translation(current) + "武将牌上", - current: current, - filterCard: true, - forced: true, - filterTarget: function (card, player, target) { - return target == _status.event.current; - }, - selectTarget: -1, - ai1: function (card) { - var current = _status.event.current; - return get.value(card, current) * get.attitude(_status.event.player, current); - }, - ai2: () => 1, - }); - "step 2"; - if (result.bool) { - result.targets[0].addToExpansion(result.cards, player, "give").gaintag.add("psliushang"); - } - if (targets.length) event.goto(1); - }, - marktext: "殇", - intro: { - content: "expansion", - markcount: "expansion", - }, - subSkill: { - give: { - trigger: { global: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return event.player != player && event.player.getExpansions("psliushang").length; - }, - forced: true, - logTarget: "player", - content: function () { - "step 0"; - var cards = trigger.player.getExpansions("psliushang"), - name = get.translation(cards); - event.cards = cards; - trigger.player - .chooseControl() - .set("choiceList", ["获得" + name + ",且于本回合防止对" + get.translation(player) + "的伤害", "将" + name + "置入弃牌堆"]) - .set("ai", () => { - return _status.event.choice; - }) - .set( - "choice", - (function () { - if (get.damageEffect(player, trigger.player, trigger.player) <= 0) return 0; - if (get.value(cards, trigger.player) < 0) return 1; - if ( - trigger.player.hasCard(card => { - return get.tag(card, "damage") && trigger.player.canUse(card, player) && get.effect(player, card, trigger.player, trigger.player) > 0; - }, "hs") - ) - return 1; - return 0; - })() - ); - "step 1"; - if (result.index == 0) { - trigger.player.gain(cards, "gain2"); - trigger.player.addTempSkill("psliushang_prevent"); - trigger.player.markAuto("psliushang_prevent", [player]); - } else { - trigger.player.loseToDiscardpile(cards); - } - "step 2"; - game.delayx(); - }, - }, - prevent: { - trigger: { source: "damageBegin2" }, - filter: function (event, player) { - return player.getStorage("psliushang_prevent").includes(event.player); - }, - forced: true, - onremove: true, - charlotte: true, - logTarget: "player", - content: function () { - trigger.cancel(); - }, - ai: { - effect: { - target: function (card, player, target, current) { - if (player.getStorage("psliushang_prevent").includes(target) && get.tag(card, "damage")) { - return "zeroplayertarget"; - } - }, - }, - }, - }, - }, - }, - psqibu: { - trigger: { player: "dying" }, - filter: function (event, player) { - return player.hp <= 0; - }, - limited: true, - skillAnimation: true, - animationColor: "water", - content: function () { - "step 0"; - player.awakenSkill("psqibu"); - var cards = game.cardsGotoOrdering(get.cards(7)).cards; - game.updateRoundNumber(); - event.cards = cards; - player.showCards(cards, get.translation(player) + "发动了【流殇】"); - "step 1"; - var num = cards.filter(i => get.suit(i) == "heart").length; - var gains = cards.filter(i => get.suit(i) == "club"); - if (num > 0) player.recover(num); - if (gains.length) player.gain(gains, "gain2"); - }, - }, - //官盗S曹丕 - psjianwei: { - audio: 2, - trigger: { player: "phaseBegin" }, - skillAnimation: true, - animationColor: "water", - limited: true, - direct: true, - filter: function (event, player) { - return player.hp >= 1; - }, - content: function () { - "step 0"; - player.chooseTarget(get.prompt2("psjianwei"), lib.filter.notMe).set("ai", target => { - var player = _status.event.player; - if (player.hp == 1 && !player.canSave(player)) return 0; - var sgn = get.sgnAttitude(player, target); - var valMine = [0, 0], - valHis = [0, 0]; - player.getCards("hej", card => { - if (get.position(card) == "j") { - valMine[0] += get.effect(player, card, player); - valMine[1] += get.effect(target, card, player); - } else { - valMine[0] += get.value(card, player); - valMine[1] += get.value(card, target) * sgn; - } - }); - target.getCards("hej", card => { - if (get.position(card) == "j") { - valHis[0] += get.effect(player, card, player); - valHis[1] += get.effect(target, card, player); - } else { - valHis[0] += get.value(card, player); - valHis[1] += get.value(card, target) * sgn; - } - }); - return valMine[1] - valMine[0] + valHis[0] - valHis[1] >= 60; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("psjianwei", target); - player.awakenSkill("psjianwei"); - player.loseHp(); - } else event.finish(); - "step 2"; - if (player.isIn() && target.isIn()) { - var next = game.createEvent("psjianwei_swap"); - next.player = player; - next.target = target; - next.set("cards1", player.getCards("hej")); - next.set("cards2", target.getCards("hej")); - next.setContent(lib.skill.psjianwei.swapRegioncards); - } - }, - swapRegioncards: function () { - "step 0"; - player.$giveAuto(event.cards1, target); - target.$giveAuto(event.cards2, player); - "step 1"; - event.h1 = event.cards1.filter(i => get.position(i) == "h"); - event.e1 = event.cards1.filter(i => get.position(i) == "e"); - event.j1 = event.cards1.filter(i => get.position(i) == "j"); - event.h2 = event.cards2.filter(i => get.position(i) == "h"); - event.e2 = event.cards2.filter(i => get.position(i) == "e"); - event.j2 = event.cards2.filter(i => get.position(i) == "j"); - game.loseAsync({ - lose_list: [ - [player, event.cards1], - [target, event.cards2], - ], - }).setContent("chooseToCompareLose"); - "step 2"; - var todis = []; - for (var i = 0; i < event.j1.length; i++) { - if (target.isDisabledJudge() || target.hasJudge(event.j1[i].viewAs || event.j1[i].name)) todis.push(event.j1[i]); - } - for (var i = 0; i < event.j2.length; i++) { - if (player.isDisabledJudge() || player.hasJudge(event.j2[i].viewAs || event.j2[i].name)) todis.push(event.j2[i]); - } - if (todis.length) game.cardsDiscard(todis); - "step 3"; - game.loseAsync({ - gain_list: [ - [player, event.h2.filter(i => get.position(i, true) == "o")], - [target, event.h1.filter(i => get.position(i, true) == "o")], - ], - }).setContent("gaincardMultiple"); - for (var i = 0; i < event.e2.length; i++) { - if (get.position(event.e2[i], true) == "o") player.equip(event.e2[i]); - } - for (var i = 0; i < event.e1.length; i++) { - if (get.position(event.e1[i], true) == "o") target.equip(event.e1[i]); - } - for (var i = 0; i < event.j2.length; i++) { - if (get.position(event.j2[i], true) == "o") player.addJudge(event.j2[i]); - } - for (var i = 0; i < event.j1.length; i++) { - if (get.position(event.j1[i], true) == "o") target.addJudge(event.j1[i]); - } - "step 4"; - game.delayx(); - }, - }, - //官盗S司马懿 - pszhonghu: { - audio: 2, - trigger: { global: "dieAfter" }, - global: "pszhonghu_skip", - filter: function (event, player) { - return player != _status.currentPhase; - }, - content: function () { - "step 0"; - var evt = trigger.getParent("phaseUse"); - if (evt && evt.name == "phaseUse") { - evt.skipped = true; - } - var evt = trigger.getParent("phase"); - if (evt && evt.name == "phase") { - game.log(evt.player, "结束了回合"); - evt.finish(); - evt.untrigger(true); - } - _status._pszhonghu = player; - }, - subSkill: { - skip: { - trigger: { player: "phaseBeforeStart" }, - forced: true, - priority: Infinity, - popup: false, - firstDo: true, - filter: function (event, player) { - if ((_status._pszhonghu && !_status._pszhonghu.isIn()) || event.player == _status._pszhonghu) delete _status._pszhonghu; - return _status._pszhonghu && event.player != _status._pszhonghu; - }, - content: function () { - trigger.cancel(null, null, "notrigger"); - }, - }, - }, - }, - //官盗S虎啸龙吟司马懿&诸葛亮 - pshuxiao: { - audio: 2, - trigger: { player: "phaseBegin" }, - frequent: true, - content: function () { - "step 0"; - player.judge(function (card) { - if (get.type(card) == "basic" || get.type(card) == "trick") return 3; - return -1; - }); - "step 1"; - if (result.bool) { - player.addTempSkill("pshuxiao_use"); - player.storage.pshuxiao_use = { - card: { name: result.name, nature: result.card.nature }, - number: result.number, - suit: result.suit, - }; - } - }, - subSkill: { - use: { - charlotte: true, - onremove: true, - enable: "chooseToUse", - popname: true, - position: "hs", - hiddenCard: function (player, name) { - return player.storage.pshuxiao_use.card.name == name; - }, - filter: function (event, player) { - if (!player.storage.pshuxiao_use) return false; - if (!player.countCards("h")) return false; - return event.filterCard(player.storage.pshuxiao_use.card, player, event); - }, - viewAs: function (cards, player) { - return player.storage.pshuxiao_use.card; - }, - filterCard: function (card, player) { - return get.number(card) == player.storage.pshuxiao_use.number || get.suit(card) == player.storage.pshuxiao_use.suit; - }, - prompt: function (event) { - var player = _status.event.player; - return "将一张" + get.translation(player.storage.pshuxiao_use.suit) + "牌或点数为" + get.strNumber(player.storage.pshuxiao_use.number) + "的牌当作" + get.translation(player.storage.pshuxiao_use.card) + "使用"; - }, - }, - }, - }, - psguanxing: { - audio: "guanxing", - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - preHidden: true, - content: function () { - "step 0"; - var num = 5; - var cards = get.cards(num); - game.cardsGotoOrdering(cards); - var next = player.chooseToMove(); - next.set("list", [["牌堆顶", cards], ["牌堆底"]]); - next.set("prompt", "观星:点击将牌移动到牌堆顶或牌堆底"); - next.processAI = function (list) { - var cards = list[0][1], - player = _status.event.player; - var top = []; - var judges = player.getCards("j"); - var stopped = false; - if (!player.hasWuxie()) { - for (var i = 0; i < judges.length; i++) { - var judge = get.judge(judges[i]); - cards.sort(function (a, b) { - return judge(b) - judge(a); - }); - if (judge(cards[0]) < 0) { - stopped = true; - break; - } else { - top.unshift(cards.shift()); - } - } - } - var bottom; - if (!stopped) { - cards.sort(function (a, b) { - return get.value(b, player) - get.value(a, player); - }); - while (cards.length) { - if (get.value(cards[0], player) <= 5) break; - top.unshift(cards.shift()); - } - } - bottom = cards; - return [top, bottom]; - }; - "step 1"; - var top = result.moved[0]; - var bottom = result.moved[1]; - top.reverse(); - for (var i = 0; i < top.length; i++) { - ui.cardPile.insertBefore(top[i], ui.cardPile.firstChild); - } - for (i = 0; i < bottom.length; i++) { - ui.cardPile.appendChild(bottom[i]); - } - player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); - game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); - game.updateRoundNumber(); - game.delayx(); - }, - ai: { - threaten: 1.2, - }, - }, - pslongyin: { - audio: 2, - enable: ["chooseToUse", "chooseToRespond"], - filter: function (event, player) { - if (!player.countCards("hse") || player.hasSkill("pslongyin_used")) return false; - for (var i of lib.inpile) { - var type = get.type(i); - if ((type == "basic" || type == "trick") && event.filterCard(get.autoViewAs({ name: i }, "unsure"), player, event)) return true; - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var list = []; - for (var i = 0; i < lib.inpile.length; i++) { - var name = lib.inpile[i]; - if (name == "sha") { - if (event.filterCard({ name: name }, player, event)) list.push(["基本", "", "sha"]); - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: name, nature: j }, player, event)) list.push(["基本", "", "sha", j]); - } - } else if (get.type(name) == "trick" && event.filterCard({ name: name }, player, event)) list.push(["锦囊", "", name]); - else if (get.type(name) == "basic" && event.filterCard({ name: name }, player, event)) list.push(["基本", "", name]); - } - return ui.create.dialog("虎啸", [list, "vcard"]); - }, - filter: function (button, player) { - return _status.event.getParent().filterCard({ name: button.link[2], nature: button.link[3] }, player, _status.event.getParent()); - }, - check: function (button) { - if (_status.event.getParent().type != "phase") return 1; - var player = _status.event.player; - if (["wugu", "zhulu_card", "yiyi", "lulitongxin", "lianjunshengyan", "diaohulishan"].includes(button.link[2])) return 0; - return player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - backup: function (links, player) { - return { - filterCard: function (card, player) { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - return get.number(card) + num <= 13; - }, - selectCard: [1, Infinity], - filterOk: function () { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - return num == 13; - }, - audio: "pslongyin", - popname: true, - complexCard: true, - check: function (card) { - var num = 0; - for (var i = 0; i < ui.selected.cards.length; i++) { - num += get.number(ui.selected.cards[i]); - } - if (num + get.number(card) == 13) return 5.5 - get.value(card); - if (ui.selected.cards.length == 0) { - var cards = _status.event.player.getCards("h"); - for (var i = 0; i < cards.length; i++) { - for (var j = i + 1; j < cards.length; j++) { - if (get.number(cards[i]) + get.number(cards[j]) == 13) { - if (cards[i] == card || cards[j] == card) return 6 - get.value(card); - } - } - } - } - return 0; - }, - position: "hes", - viewAs: { name: links[0][2], nature: links[0][3] }, - precontent: function () { - player.addTempSkill("pslongyin_used"); - }, - }; - }, - prompt: function (links, player) { - return "将任意张点数和为13牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用"; - }, - }, - hiddenCard: function (player, name) { - if (!lib.inpile.includes(name)) return false; - var type = get.type(name); - return (type == "basic" || type == "trick") && player.countCards("she") > 0 && !player.hasSkill("pslongyin_used"); - }, - ai: { - fireAttack: true, - respondSha: true, - respondShan: true, - skillTagFilter: function (player) { - if (!player.countCards("hse") || player.hasSkill("pslongyin_used")) return false; - }, - order: 1, - result: { - player: function (player) { - if (_status.event.dying) return get.attitude(player, _status.event.dying); - return 1; - }, - }, - }, - subSkill: { - used: { charlotte: true }, - }, - }, - //官盗S武将传诸葛亮 - pszhiji: { - audio: 2, - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - if (!ui.selected.targets.length) return true; - return target.group != ui.selected.targets[0].group; - }, - selectTarget: 2, - complexTarget: true, - multitarget: true, - multiline: true, - filterCard: true, - selectCard: 2, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - targets.sortBySeat(); - if (targets[0].canUse("sha", targets[1], false)) targets[0].useCard({ name: "sha", isCard: true }, targets[1], false, "noai"); - "step 1"; - if (targets[1].canUse("sha", targets[0], false)) targets[1].useCard({ name: "sha", isCard: true }, targets[0], false, "noai"); - }, - ai: { - order: 2.5, - result: { - player: 1, - target: function (player, target) { - if (ui.selected.targets.length) { - var targetx = ui.selected.targets[0]; - if (get.effect(targetx, { name: "sha" }, target, player) + get.effect(target, { name: "sha" }, targetx, player) < 0) return 0; - return -1; - } - return -1; - }, - }, - }, - }, - psjiefeng: { - audio: 2, - enable: "phaseUse", - filterCard: true, - selectCard: 2, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - var cards = game.cardsGotoOrdering(get.cards(5)).cards; - event.cards = cards; - player.showCards(cards, get.translation(player) + "发动了【借风】"); - "step 1"; - if (cards.filter(i => get.color(i) == "red").length >= 2) { - player.chooseUseTarget("wanjian", true); - } - }, - ai: { - order: 9, - result: { - player: function (player) { - if (player.getUseValue({ name: "wanjian" }) < 0) return 0; - return 1; - }, - }, - }, - }, - //官盗S马超 - psweihou: { - trigger: { player: "judgeBegin" }, - filter: function (event, player) { - return !event.directresult; - }, - content: function () { - "step 0"; - var cards = get.cards(2); - for (var i = cards.length - 1; i >= 0; i--) { - ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); - } - game.updateRoundNumber(); - event.cards = cards; - event.videoId = lib.status.videoId++; - game.broadcastAll( - function (player, id, cards) { - var str; - if (player == game.me && !_status.auto) str = "威侯:选择一张作为本次判定结果"; - else str = get.translation(player) + "发动了【威侯】"; - var dialog = ui.create.dialog(str, cards); - dialog.videoId = id; - }, - player, - event.videoId, - event.cards - ); - game.addVideo("showCards", player, ["威侯", get.cardsInfo(event.cards)]); - if (!event.isMine() && !event.isOnline()) game.delayx(); - "step 1"; - player - .chooseButton(["威侯:选择一张作为本次判定结果", cards], true) - .set("ai", button => { - return _status.event.getTrigger().judge(button.link); - }) - .set("dialog", event.videoId); - "step 2"; - game.broadcastAll("closeDialog", event.videoId); - if (result.bool) { - trigger.directresult = result.links[0]; - game.cardsDiscard(cards.removeArray(result.links).filter(i => get.position(i) == "c")); - } - "step 3"; - game.updateRoundNumber(); - }, - }, - //官盗S1066★贾诩 - psqupo: { - audio: 2, - trigger: { global: "phaseBegin" }, - filter: function (event, player) { - return player.countCards("he"); - }, - direct: true, - content: function () { - "step 0"; - var cards = player.getCards("he"); - var current = trigger.player; - var ai1 = function (card) { - var player = _status.event.player, - current = _status.event.current; - var card = get.color(card); - if (color == "black") { - if (!current.hasSha() || !current.hasUseTarget({ name: "sha" })) return 0; - if (targets.length) return 5.5 - get.value(card); - } else if (color == "red") { - if (get.attitude(player, current) <= 0) return 0; - if ( - current.hasCard(card => { - if (!get.tag(card, "damage")) return false; - var targetsx = game.filterPlayer(currentx => { - if (currentx == current || current == player) return false; - return current.canUse(card, currentx) && get.effect(currentx, card, current, player) > 0; - }); - targets2.addArray(targetsx); - return targetsx.length; - }, "hs") - ) - return 5.5 - get.value(card); - } - return 0; - }; - var targets = game.filterPlayer(currentx => { - if (currentx == current || current == player) return false; - return !current.canUse("sha", currentx) || (get.effect(currentx, { name: "sha" }, current, player) > 0 && get.attitude(player, currentx) > -3); - }); - targets.sort((a, b) => get.attitude(player, b) - get.attitude(player, a)); - var targets2 = []; - var cardx = cards.sort((a, b) => ai1(b) - ai1(a))[0]; - targets2.sort((a, b) => get.threaten(b, current) - get.threaten(a, current)); - var next = player.chooseCardTarget({ - filterCard: true, - prompt: get.prompt2("psqupo"), - current: trigger.player, - filterTarget: function (card, player, target) { - return player != target && target != _status.event.current; - }, - ai1: function (card) { - return card == _status.event.cardx ? 1 : 0; - }, - ai2: function (target) { - return target == _status.event.targetx ? 1 : 0; - }, - }); - if (ai1(cardx) > 0) { - next.cardx = cardx; - if (get.color(cardx) == "black") { - if (targets.length) next.targetx = targets[0]; - } else { - if (targets2.length) next.targetx = targets2[0]; - } - } - "step 1"; - if (result.bool) { - var target = result.targets[0], - cards = result.cards; - player.logSkill("psqupo", target); - player.give(cards, target); - var color = get.color(cards[0]); - if (color == "black") { - _status.currentPhase.addTempSkill("psqupo_black"); - _status.currentPhase.markAuto("psqupo_black", [target]); - } else if (color == "red") { - target.addTempSkill("psqupo_red"); - target.addMark("psqupo_red", 1, false); - } - } - }, - subSkill: { - black: { - trigger: { player: "useCardToTarget" }, - forced: true, - charlotte: true, - onremove: true, - filter: function (event, player) { - if (event.card.name != "sha") return false; - var targets = player.getStorage("psqupo_black").slice(); - targets.remove(event.target); - return targets.length; - }, - content: function () { - var targets = player.getStorage("psqupo_black").slice(); - targets.remove(trigger.target); - player.loseHp(targets.length); - }, - }, - red: { - trigger: { player: "damageBegin3" }, - charlotte: true, - forced: true, - onremove: true, - content: function () { - player.loseHp(player.countMark("psqupo_red")); - player.removeSkill("psqupo_red"); - }, - }, - }, - }, - psbaoquan: { - audio: 2, - trigger: { player: "damageBegin4" }, - filter: function (event, player) { - return player.countCards("h", { type: ["trick", "delay"] }) || _status.connectMode; - }, - direct: true, - content: function () { - "step 0"; - player - .chooseToDiscard(get.prompt2("psbaoquan"), { type: ["trick", "delay"] }) - .set("logSkill", "psbaoquan") - .set("ai", card => { - if (_status.event.goon) return 7 - get.value(card); - return 0; - }) - .set("goon", get.damageEffect(player, trigger.source, player) < -5); - "step 1"; - if (result.bool) { - trigger.cancel(); - } - }, - }, - //官盗S吕布 - pssheji: { - audio: 2, - enable: "phaseUse", - filterCard: true, - selectCard: -1, - position: "h", - locked: false, - filter: function (event, player) { - if (player.hasSkill("pssheji_used")) return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var card of hs) { - var mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); - if (mod2 === false) return false; - } - return event.filterCard(get.autoViewAs({ name: "sha" }, hs)); - }, - viewAs: { - name: "sha", - storage: { pssheji: true }, - }, - onuse: function (links, player) { - player.addTempSkill("pssheji_used", "phaseUseAfter"); - }, - ai: { - order: 1, - threaten: 1.1, - }, - mod: { - targetInRange: function (card, player, target) { - if (card.storage && card.storage.pssheji) return true; - }, - }, - subSkill: { - used: { - audio: "pssheji", - trigger: { source: "damageSource" }, - charlotte: true, - forced: true, - popup: false, - logTarget: "player", - filter: function (event, player) { - return ( - event.card.storage && - event.card.storage.pssheji && - event.player.hasCard(card => { - if (!lib.filter.canBeGained(card, player, event.player)) return false; - return ["equip1", "equip3", "equip4", "equip6"].includes(get.subtype(card)); - }, "e") - ); - }, - content: function () { - var cards = trigger.player.getCards("e", card => { - if (!lib.filter.canBeGained(card, player, trigger.player)) return false; - return ["equip1", "equip3", "equip4", "equip6"].includes(get.subtype(card)); - }); - if (cards.length) player.gain(cards, "giveAuto", trigger.player); - }, - }, - }, - }, - //战役篇国战将转身份 - //钟会 - zyquanji: { - audio: "gzquanji", - trigger: { - player: "damageEnd", - source: "damageSource", - }, - frequent: true, - filter: function (event, player, name) { - if (name == "damageEnd") return true; - var evt = event.getParent(); - if (evt.player != player) return false; - return evt.card && evt.type == "card" && evt.targets.length == 1; - }, - content: function () { - "step 0"; - player.draw(); - "step 1"; - var hs = player.getCards("he"); - if (hs.length > 0) { - if (hs.length == 1) event._result = { bool: true, cards: hs }; - else player.chooseCard("he", true, "选择一张牌作为“权”"); - } else event.finish(); - "step 2"; - if (result.bool) { - var cs = result.cards; - player.addToExpansion(cs, player, "give").gaintag.add("zyquanji"); - } - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); - }, - locked: false, - mod: { - maxHandcard: function (player, num) { - return num + player.getExpansions("zyquanji").length; - }, - }, - }, - zypaiyi: { - audio: "gzpaiyi", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.getExpansions("zyquanji").length > 0; - }, - chooseButton: { - dialog: function (event, player) { - return ui.create.dialog("排异", player.getExpansions("zyquanji"), "hidden"); - }, - backup: function (links, player) { - return { - audio: "gzpaiyi", - filterTarget: true, - filterCard: function () { - return false; - }, - selectCard: -1, - card: links[0], - delay: false, - content: lib.skill.zypaiyi.contentx, - ai: { - order: 10, - result: { - target: function (player, target) { - if (target != player) return 0; - if (player.getExpansions("zyquanji").length <= 1 || (player.needsToDiscard() && !player.getEquip("zhuge") && !player.hasSkill("new_paoxiao"))) return 0; - return 1; - }, - }, - }, - }; - }, - prompt: function () { - return "请选择【排异】的目标"; - }, - }, - contentx: function () { - "step 0"; - var card = lib.skill.zypaiyi_backup.card; - player.loseToDiscardpile(card); - "step 1"; - var num = player.getExpansions("zyquanji").length; - if (num > 0) target.draw(Math.min(7, num)); - "step 2"; - if (target.countCards("h") > player.countCards("h")) { - target.damage(); - } - }, - ai: { - order: function (item, player) { - var num = player.getExpansions("zyquanji").length; - if (num == 1) return 8; - return 1; - }, - result: { - player: 1, - }, - combo: "zyquanji", - }, - }, - //孙綝 - zyshilu: { - audio: "gzshilu", - preHidden: true, - trigger: { global: "dieAfter" }, - prompt2: function (event, player) { - return "将其的所有武将牌" + (player == event.source ? "及武将牌库里的一张随机武将牌" : "") + "置于武将牌上作为“戮”"; - }, - logTarget: "player", - content: function () { - var list = [], - target = trigger.player; - if (target.name1 && !target.isUnseen(0) && target.name1.indexOf("gz_shibing") != 0 && _status.characterlist.includes(target.name1)) list.push(target.name1); - if (target.name2 && !target.isUnseen(1) && target.name2.indexOf("gz_shibing") != 0 && _status.characterlist.includes(target.name1)) list.push(target.name2); - _status.characterlist.removeArray(list); - if (player == trigger.source) list.addArray(_status.characterlist.randomRemove(1)); - if (list.length) { - player.markAuto("zyshilu", list); - game.log(player, "将", "#g" + get.translation(list), "置于武将牌上作为", "#y“戮”"); - game.broadcastAll( - function (player, list) { - var cards = []; - for (var i = 0; i < list.length; i++) { - var cardname = "huashen_card_" + list[i]; - lib.card[cardname] = { - fullimage: true, - image: "character:" + list[i], - }; - lib.translate[cardname] = get.rawName2(list[i]); - cards.push(game.createCard(cardname, "", "")); - } - player.$draw(cards, "nobroadcast"); - }, - player, - list - ); - } - }, - marktext: "戮", - intro: { - content: "character", - onunmark: function (storage, player) { - if (storage && storage.length) { - _status.characterlist.addArray(storage); - storage.length = 0; - } - }, - mark: function (dialog, storage, player) { - if (storage && storage.length) { - dialog.addSmall([storage, "character"]); - } else { - return "没有“戮”"; - } - }, - // content:function(storage,player){ - // return '共有'+get.cnNumber(storage.length)+'张“戮”'; - // }, - }, - group: "zyshilu_zhiheng", - subSkill: { - zhiheng: { - audio: "zyshilu", - trigger: { player: "phaseZhunbeiBegin" }, - filter: function (event, player) { - return player.getStorage("zyshilu").length > 0 && player.countCards("he") > 0; - }, - direct: true, - content: function () { - "step 0"; - var num = Math.min(player.getStorage("zyshilu").length, player.countCards("he")); - player.chooseToDiscard("he", get.prompt("zyshilu"), "弃置至多" + get.cnNumber(num) + "张牌并摸等量的牌", [1, num]).logSkill = "zyshilu_zhiheng"; - "step 1"; - if (result.bool && result.cards && result.cards.length) player.draw(result.cards.length); - }, - }, - }, - }, - zyxiongnve: { - audio: "gzxiongnve", - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return player.getStorage("zyshilu").length > 0; - }, - content: function () { - "step 0"; - player - .chooseButton([get.prompt("zyxiongnve"), [player.storage.zyshilu, "character"]]) - .set("ai", function (button) { - if (!_status.event.goon) return 0; - return 1; - }) - .set( - "goon", - player.countCards("hs", function (card) { - return get.tag(card, "damage") && player.hasValueTarget(card); - }) > 1 - ); - "step 1"; - if (result.bool) { - player.logSkill("zyxiongnve"); - lib.skill.zyxiongnve.throwCharacter(player, result.links); - game.delayx(); - player - .chooseControl() - .set("prompt", "选择获得一项效果") - .set("choiceList", ["本回合造成的伤害+1", "本回合造成伤害时,获得其一张牌", "本回合使用牌没有次数限制"]) - .set("ai", function () { - var player = _status.event.player; - if ( - player.countCards("hs", function (card) { - return get.name(card) == "sha" && player.hasValueTarget(card); - }) > player.getCardUsable("sha") - ) - return 0; - return get.rand(1, 2); - }); - } else event.finish(); - "step 2"; - var skill = "zyxiongnve_effect" + result.index; - player.addTempSkill(skill); - game.log(player, "本回合", "#g" + lib.skill[skill].promptx); - }, - group: "zyxiongnve_end", - throwCharacter: function (player, list) { - player.unmarkAuto("zyshilu", list); - _status.characterlist.addArray(list); - game.log(player, "从", "#y“戮”", "中移去了", "#g" + get.translation(list)); - game.broadcastAll( - function (player, list) { - var cards = []; - for (var i = 0; i < list.length; i++) { - var cardname = "huashen_card_" + list[i]; - lib.card[cardname] = { - fullimage: true, - image: "character:" + list[i], - }; - lib.translate[cardname] = get.rawName2(list[i]); - cards.push(game.createCard(cardname, "", "")); - } - player.$throw(cards, 1000, "nobroadcast"); - }, - player, - list - ); - }, - subSkill: { - effect0: { - promptx: "造成的伤害+1", - charlotte: true, - onremove: true, - audio: "zyxiongnve", - intro: { - content: "当你造成伤害时,此伤害+1", - }, - trigger: { source: "damageBegin1" }, - forced: true, - logTarget: "player", - content: function () { - trigger.num++; - }, - }, - effect1: { - promptx: "造成伤害后,获得其一张牌", - charlotte: true, - onremove: true, - audio: "zyxiongnve", - intro: { - content: "对其他角色造成伤害时,获得其一张牌", - }, - trigger: { source: "damageBegin1" }, - forced: true, - filter: function (event, player) { - return player != event.player && event.player.countGainableCards(player, "he") > 0; - }, - logTarget: "player", - content: function () { - player.gainPlayerCard(trigger.player, true, "he"); - }, - }, - effect2: { - promptx: "使用牌没有次数限制", - charlotte: true, - onremove: true, - intro: { - content: "使用牌没有次数限制", - }, - mod: { - cardUsable: () => Infinity, - }, - }, - effect3: { - charlotte: true, - audio: "zyxiongnve", - mark: true, - intro: { - content: "受到的伤害-1", - }, - trigger: { player: "damageBegin4" }, - forced: true, - filter: function (event, player) { - return event.source != player && event.source && event.source.isIn(); - }, - content: function () { - trigger.num--; - }, - ai: { - effect: { - target: function (card, player, target) { - if (player.hasSkillTag("jueqing", false, target)) return; - var num = get.tag(card, "damage"); - if (num) { - if (num > 1) return 0.5; - return 0; - } - }, - }, - }, - }, - end: { - trigger: { player: "phaseUseEnd" }, - direct: true, - filter: function (event, player) { - return player.getStorage("zyshilu").length > 1; - }, - content: function () { - "step 0"; - player.chooseButton(["凶虐:是否移去两张“戮”获得减伤?", [player.storage.zyshilu, "character"]], 2).set("ai", function (button) { - var player = _status.event.player; - if (game.countPlayer() * 1.5 + player.storage.zyshilu.length / 2 > 8) return 1; - if (player.hp <= 2) return 1; - return 0; - }); - "step 1"; - if (result.bool) { - player.logSkill("zyxiongnve"); - lib.skill.zyxiongnve.throwCharacter(player, result.links); - player.addTempSkill("zyxiongnve_effect3", { player: "phaseBegin" }); - game.delayx(); - } - }, - }, - }, - ai: { - combo: "zyshilu", - }, - }, - //孟达 - qiuan: { - audio: 2, - trigger: { player: "damageBegin4" }, - filter: function (event, player) { - return event.cards && event.cards.filterInD().length > 0 && !player.getExpansions("qiuan").length; - }, - check: function (event, player) { - if (get.damageEffect(player, event.source || player, player, event.nature) >= 0) return false; - return true; - }, - preHidden: true, - content: function () { - var cards = trigger.cards.filterInD(); - player.addToExpansion("gain2", cards).gaintag.add("qiuan"); - trigger.cancel(); - }, - ai: { - combo: "liangfan", - }, - intro: { - content: "expansion", - markcount: "expansion", - }, - marktext: "函", - }, - liangfan: { - audio: 2, - trigger: { player: "phaseZhunbeiBegin" }, - forced: true, - filter: function (event, player) { - return player.getExpansions("qiuan").length > 0; - }, - content: function () { - "step 0"; - var cards = player.getExpansions("qiuan"); - player.gain(cards, "gain2").gaintag.add("liangfan"); - player.addTempSkill("liangfan2"); - "step 1"; - player.loseHp(); - }, - ai: { - combo: "qiuan", - }, - }, - liangfan2: { - audio: "liangfan", - mark: true, - mod: { - aiOrder: function (player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("liangfan")) return num + 0.1; - }, - }, - intro: { content: "使用“量反”牌造成伤害后,可获得目标角色的一张牌" }, - trigger: { source: "damageEnd" }, - logTarget: "player", - charlotte: true, - onremove: function (player) { - player.removeGaintag("liangfan"); - }, - prompt: event => "量反:是否获得" + get.translation(event.player) + "的一张牌?", - filter: function (event, player) { - var evt = event.getParent(2); - if (evt.name != "useCard" || evt.card != event.card) return false; - if (!event.player.countGainableCards(player, "he")) return false; - return ( - player.getHistory("lose", function (evt2) { - if (evt2.getParent() != evt) return false; - for (var i in evt2.gaintag_map) { - if (evt2.gaintag_map[i].includes("liangfan")) return true; - } - return false; - }).length > 0 - ); - }, - marktext: "反", - content: function () { - player.gainPlayerCard(trigger.player, true, "he"); - }, - }, - //文钦 - gzjinfa: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return ( - player.countCards("he") > 0 && - game.hasPlayer(function (current) { - return current != player && current.countCards("he") > 0; - }) - ); - }, - filterCard: true, - position: "he", - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") > 0; - }, - check: function (card) { - return 6 - get.value(card); - }, - content: function () { - "step 0"; - target - .chooseCard("he", "交给" + get.translation(player) + "一张装备牌,或令其获得你的一张牌", { type: "equip" }) - .set("ai", function (card) { - if (_status.event.goon && get.suit(card) == "spade") return 8 - get.value(card); - return 5 - get.value(card); - }) - .set("goon", target.canUse("sha", player, false) && get.effect(player, { name: "sha" }, target, target) > 0); - "step 1"; - if (!result.bool) { - player.gainPlayerCard(target, "he", true); - event.finish(); - } else target.give(result.cards, player); - "step 2"; - if (result.bool && result.cards && result.cards.length && target.isIn() && player.isIn() && get.suit(result.cards[0], target) == "spade" && target.canUse("sha", player, false)) target.useCard({ name: "sha", isCard: true }, false, player); - }, - ai: { - order: 6, - result: { - player: function (player, target) { - if ( - target.countCards("e", function (card) { - return get.suit(card) == "spade" && get.value(card) < 8; - }) && - target.canUse("sha", player, false) - ) - return get.effect(player, { name: "sha" }, target, player); - return 0; - }, - target: function (player, target) { - var es = target.getCards("e").sort(function (a, b) { - return get.value(b, target) - get.value(a, target); - }); - if (es.length) return -Math.min(2, get.value(es[0])); - return -2; - }, - }, - }, - }, - //一战成名·群雄逐鹿·长安之战专属神贾诩 - zybishi: { - audio: 2, - trigger: { target: "useCardToTargeted" }, - filter: function (event, player) { - return event.card.name == "sha" && event.player != player; - }, - check: function (event, player) { - var effect = 0; - if (event.targets && event.targets.length) { - for (var i = 0; i < event.targets.length; i++) { - effect += get.effect(event.targets[i], event.card, event.player, player); - } - } - if (effect < 0) { - var target = event.targets[0]; - if (target == player) { - return !player.countCards("h", "shan"); - } else { - return target.hp == 1 || (target.countCards("h") <= 2 && target.hp <= 2); - } - } - return false; - }, - content: function () { - player.line(trigger.player, "green"); - trigger.player.draw(); - var evt = trigger.getParent(); - evt.targets.length = 0; - evt.all_excluded = true; - game.log(evt.card, "被无效了"); - }, - }, - zyjianbing: { - audio: 2, - trigger: { global: "damageBegin3" }, - logTarget: "player", - filter: function (event, player) { - return event.player != player && event.player.isIn() && event.card && event.card.name == "sha" && event.player.countGainableCards(player, "he") > 0; - }, - content: function () { - "step 0"; - player.gainPlayerCard(trigger.player, true, "he"); - "step 1"; - if (result.bool && result.cards && result.cards.length) { - var card = result.cards[0]; - if (get.suit(card, trigger.player) == "heart") { - trigger.player.recover(); - } - } - }, - }, - //战役篇改王允 - zylianji: { - audio: "wylianji", - trigger: { player: "phaseUseEnd" }, - filter: function (event, player) { - return player.hasHistory("useCard", evt => evt.getParent("phaseUse") == event); - }, - direct: true, - content: function () { - "step 0"; - var types = []; - player.getHistory("useCard", evt => { - if (evt.getParent("phaseUse") != trigger) return false; - types.add(get.type2(evt.card)); - }); - event.num = types.length; - event.logged = false; - player.chooseTarget(get.prompt("zylianji"), "令一名角色摸一张牌").set("ai", target => { - var player = _status.event.player; - if (target == player && player.needsToDiscard(1)) return 1; - return get.effect(target, { name: "draw" }, player, player); - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - if (!event.logged) { - event.logged = true; - player.logSkill("zylianji", target); - } - target.draw(); - } - if (event.num <= 1) event.finish(); - "step 2"; - if (player.isHealthy()) event._result = { bool: false }; - else player.chooseBool(get.prompt("zylianji"), "回复1点体力").set("ai", () => true); - "step 3"; - if (result.bool) { - if (!event.logged) { - event.logged = true; - player.logSkill("zylianji"); - } - player.recover(); - } - if (event.num <= 2) event.finish(); - "step 4"; - player.chooseTarget(get.prompt("zylianji"), "跳过本回合的剩余阶段,然后令一名其他角色执行这些阶段", lib.filter.notMe).set("ai", target => { - var att = get.attitude(_status.event.player, target), - num = target.needsToDiscard(), - numx = player.needsToDiscard(); - if (att < 0 && num > 0) return (-att * Math.sqrt(num)) / 3 + numx; - var skills = target.getSkills(); - var val = 0; - for (var skill of skills) { - var info = get.info(skill); - if (info.trigger && info.trigger.player && (info.trigger.player.indexOf("phaseJieshu") == 0 || (Array.isArray(info.trigger.player) && info.trigger.player.some(i => i.indexOf("phaseJieshu") == 0)))) { - var threaten = info.ai && info.ai.threaten ? info.ai.threaten : 1; - if (info.ai && info.ai.neg) val -= 3 * threaten; - else if (info.ai && info.ai.halfneg) val -= 1.5 * threaten; - else val += threaten; - } - } - return (att * val) / 2 + numx; - }); - "step 5"; - if (result.bool) { - var target = result.targets[0]; - if (!event.logged) { - event.logged = true; - player.logSkill("zylianji", target); - } else player.line(target); - player.addTempSkill("zylianji_skip"); - player.storage.zylianji_insert = target; - } - }, - subSkill: { - skip: { - trigger: { - player: ["phaseZhunbeiBefore", "phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore", "phaseJieshuBefore"], - }, - init: function (player) { - if (!player.storage.zylianji_skip) player.storage.zylianji_skip = []; - }, - forced: true, - charlotte: true, - group: "zylianji_insert", - onremove: true, - content: function () { - trigger.cancel(); - player.storage.zylianji_skip.push(trigger.name); - }, - }, - insert: { - trigger: { player: "phaseEnd" }, - filter: function (event, player) { - return player.storage.zylianji_skip && player.storage.zylianji_skip.length && player.storage.zylianji_insert && player.storage.zylianji_insert.isIn(); - }, - forced: true, - charlotte: true, - onremove: true, - getStr: function (str) { - switch (str) { - case "phaseDraw": - return "player.phaseDraw();if(!player.noPhaseDelay){if(player==game.me){game.delay()}else{game.delayx()}}"; - case "phaseDiscard": - return "game.broadcastAll(function(){if(ui.tempnowuxie){ui.tempnowuxie.close();delete ui.tempnowuxie;}});player.phaseDiscard();if(!player.noPhaseDelay){game.delayx()};delete player._noSkill;"; - default: - return "player." + str + "();"; - } - }, - content: function () { - "step 0"; - var func = ""; - for (var i = 0; i < player.storage.zylianji_skip.length; i++) { - var phase = player.storage.zylianji_skip[i]; - func += "\n'step" + " " + i + "'\n"; - func += lib.skill.zylianji_insert.getStr(phase); - } - player.line(player.storage.zylianji_insert); - player.storage.zylianji_insert.insertPhase().setContent(new Function(func))._noTurnOver = true; - }, - }, - }, - }, - zymoucheng: { - enable: "phaseUse", - usable: 1, - viewAs: { name: "jiedao" }, - filterCard: { color: "black" }, - position: "he", - check: function (card) { - return 4.5 - get.value(card); - }, - }, - //用间篇豪华版盒子甄姬 - yjluoshen: { - audio: "luoshen", - trigger: { player: "phaseZhunbeiBegin" }, - frequent: true, - content: function () { - "step 0"; - event.cards = []; - "step 1"; - var next = player.judge(function (card) { - var color = get.color(card); - var evt = _status.event.getParent("yjluoshen"); - if (evt) { - if (!evt.color) evt.color = color; - else if (evt.color != color) return -1; - } - return 1; - }); - next.judge2 = function (result) { - return result.bool; - }; - if (get.mode() != "guozhan" && !player.hasSkillTag("rejudge")) - next.set("callback", function () { - if (get.position(card, true) == "o") player.gain(card, "gain2"); - }); - else - next.set("callback", function () { - event.getParent().orderingCards.remove(card); - }); - "step 2"; - if (result.judge > 0) { - event.cards.push(result.card); - player.chooseBool("是否再次发动【洛神】?").set("frequentSkill", "yjluoshen"); - } else { - for (var i = 0; i < event.cards.length; i++) { - if (get.position(event.cards[i], true) != "o") { - event.cards.splice(i, 1); - i--; - } - } - if (event.cards.length) { - player.gain(event.cards, "gain2"); - } - event.finish(); - } - "step 3"; - if (result.bool) { - event.goto(1); - } else { - if (event.cards.length) { - player.gain(event.cards, "gain2"); - } - } - }, - }, - //用间篇豪华版盒子贾诩 - yjzhenlve: { - audio: "zhenlue", - inherit: "zhenlue", - content: function () { - trigger.directHit.addArray(game.players); - }, - }, - yjjianshu: { - audio: "jianshu", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - filterTarget: function (card, player, target) { - if (target == player) return false; - if (ui.selected.targets.length) { - return ui.selected.targets[0] != target && !ui.selected.targets[0].hasSkillTag("noCompareSource") && target.countCards("h") && !target.hasSkillTag("noCompareTarget"); - } - return true; - }, - filterCard: true, - discard: false, - lose: false, - delay: false, - check: function (card) { - if (_status.event.player.hp == 1) return 8 - get.value(card); - return 6 - get.value(card); - }, - selectTarget: 2, - targetprompt: ["发起者", "拼点对象"], - multitarget: true, - content: function () { - "step 0"; - player.give(cards, targets[0], "give"); - "step 1"; - if (targets[0].canCompare(targets[1])) targets[0].chooseToCompare(targets[1]); - else event.finish(); - "step 2"; - if (result.bool) { - targets[1].loseHp(); - } else if (result.tie) { - targets[0].loseHp(); - targets[1].loseHp(); - } else { - targets[0].loseHp(); - } - }, - ai: { - expose: 0.4, - order: 4, - result: { - target: function (player, target) { - if (ui.selected.targets.length) return -1; - return -0.5; - }, - }, - }, - }, - yjyongdi: { - audio: "yongdi", - unique: true, - limited: true, - trigger: { player: "phaseZhunbeiBegin" }, - animationColor: "thunder", - skillAnimation: "legend", - mark: true, - intro: { - content: "limited", - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yjyongdi"), function (card, player, target) { - return target.hasSex("male") || target.name == "key_yuri"; - }) - .set("ai", function (target) { - if (!_status.event.goon) return 0; - var player = _status.event.player; - var att = get.attitude(player, target); - if (att <= 1) return 0; - var mode = get.mode(); - if (mode == "identity" || (mode == "versus" && _status.mode == "four")) { - if (target.name && lib.character[target.name]) { - for (var i = 0; i < lib.character[target.name][3].length; i++) { - if (lib.skill[lib.character[target.name][3][i]].zhuSkill) { - return att * 2; - } - } - } - } - return att; - }) - .set("goon", !player.hasUnknown()); - "step 1"; - if (result.bool) { - player.awakenSkill("yjyongdi"); - player.logSkill("yjyongdi", result.targets); - var target = result.targets[0]; - target.gainMaxHp(true); - target.recover(); - var mode = get.mode(); - if (mode == "identity" || (mode == "versus" && _status.mode == "four") || mode == "doudizhu") { - if (target.name && lib.character[target.name]) { - var skills = lib.character[target.name][3]; - target.storage.zhuSkill_yjyongdi = []; - for (var i = 0; i < skills.length; i++) { - var info = lib.skill[skills[i]]; - if (info.zhuSkill) { - target.storage.zhuSkill_yjyongdi.push(skills[i]); - if (info.init) { - info.init(target); - } - if (info.init2) { - info.init2(target); - } - } - } - } - } - } - }, - ai: { - expose: 0.2, - }, - }, - //用间篇豪华版盒子许攸 - yjshicai: { - audio: "spshicai", - enable: "phaseUse", - usable: 1, - filterCard: true, - position: "he", - prompt: function () { - var str = "弃置一张牌,然后获得"; - if (get.itemtype(_status.pileTop) == "card") str += get.translation(_status.pileTop); - else str += "牌堆顶的一张牌"; - return str; - }, - check: function (card) { - var player = _status.event.player; - var cardx = _status.pileTop; - if (get.itemtype(cardx) != "card") return 0; - var val = player.getUseValue(cardx, null, true); - if (!val) return 0; - var val2 = player.getUseValue(card, null, true); - return (val - val2) / Math.max(0.1, get.value(card)); - }, - group: ["yjshicai_mark"], - content: function () { - var card = get.cards()[0]; - player.gain(card, "gain2").gaintag.add("yjshicai_clear"); - player.addTempSkill("yjshicai_clear", "phaseUseAfter"); - }, - ai: { - order: 3, - result: { player: 1 }, - }, - subSkill: { - mark: { - trigger: { player: "phaseBegin" }, - silent: true, - firstDo: true, - content: function () { - player.addTempSkill("spshicai2"); - }, - }, - clear: { - trigger: { - player: "loseAfter", - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - onremove: function (player, skill) { - player.removeGaintag(skill); - }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - if (event.name == "lose") { - for (var i in event.gaintag_map) { - if (event.gaintag_map[i].includes("yjshicai_clear")) return true; - } - return false; - } - return player.hasHistory("lose", function (evt) { - if (evt.getParent() != event) return false; - for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("yjshicai_clear")) return true; - } - }); - }, - content: function () { - delete player.getStat("skill").yjshicai; - }, - }, - }, - }, - yjchenggong: { - audio: "chenggong", - trigger: { - global: "useCardToPlayered", - }, - filter: function (event, player) { - return event.isFirstTarget && event.targets.length > 1 && event.player.isIn(); - }, - check: function (event, player) { - return get.attitude(player, event.player) > 0; - }, - logTarget: "player", - content: function () { - trigger.player.draw(); - }, - ai: { expose: 0.2 }, - }, - yjzezhu: { - audio: "zezhu", - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - var zhu = get.mode() == "identity" ? get.zhu(player) : game.filterPlayer(i => i.getSeatNum() == 1)[0]; - if (!zhu) return false; - return zhu.countGainableCards(player, zhu == player ? "ej" : "hej"); - }, - filterTarget: function (card, player, target) { - var zhu = get.mode() == "identity" ? get.zhu(player) : game.filterPlayer(i => i.getSeatNum() == 1)[0]; - return target == zhu; - }, - selectTarget: 1, - content: function () { - "step 0"; - player.gainPlayerCard(target, player == target ? "ej" : "hej", true); - "step 1"; - if (!player.countCards("he") || player == target) event.finish(); - else player.chooseCard("择主:交给" + get.translation(target) + "一张牌", "he", true); - "step 2"; - player.give(result.cards, target); - }, - ai: { - order: 2.9, - result: { player: 1 }, - }, - }, - //用间beta董卓 - yjtuicheng: { - audio: 2, - enable: "phaseUse", - viewAs: { name: "tuixinzhifu", isCard: true }, - filterCard: () => false, - selectCard: -1, - log: false, - precontent: function () { - player.logSkill("yjtuicheng"); - player.loseHp(); - }, - ai: { - effect: { - player: function (card, player) { - if (get.name(card) != "tuixinzhifu" || _status.event.skill != "yjtuicheng") return; - if (player.hp < 3) return "zeroplayertarget"; - if (player.hasSkill("yjshicha") && !player.hasHistory("useSkill", evt => evt.skill == "yjtuicheng")) return [1, 2]; - return "zeroplayertarget"; - }, - }, - }, - }, - yjyaoling: { - audio: 2, - trigger: { - player: "phaseUseEnd", - }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt("yjyaoling"), "减1点体力上限,选择一名其他角色A和一名角色B,令A选择对B使用杀或被你弃牌", 2, (card, player, target) => { - if (!ui.selected.targets.length) return target != player; - return ui.selected.targets[0].canUse("sha", target, false); - }) - .set("targetprompt", ["打人", "被打"]) - .set("complexSelect", true) - .set("ai", target => { - var player = _status.event.player; - if (!ui.selected.targets.length) return get.effect(target, { name: "guohe_copy2" }, player, player); - var targetx = ui.selected.targets[0]; - return get.effect(target, { name: "sha" }, targetx, player) + 5; - }); - "step 1"; - if (result.bool) { - var targets = result.targets; - event.targets = targets; - player.logSkill("yjyaoling", targets, false); - player.line2(targets); - player.loseMaxHp(); - targets[0] - .chooseToUse( - function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, - "耀令:对" + get.translation(targets[1]) + "使用一张杀,或令" + get.translation(player) + "弃置你的一张牌" - ) - .set("targetRequired", true) - .set("filterTarget", function (card, player, target) { - if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this, arguments); - }) - .set("sourcex", targets[1]); - } else event.finish(); - "step 2"; - if (!result.bool && targets[0].countDiscardableCards(player, "he")) { - player.discardPlayerCard(targets[0], "he", true); - } - }, - }, - yjshicha: { - audio: 2, - trigger: { player: "phaseDiscardBegin" }, - forced: true, - filter: function (event, player) { - var tuicheng = false, - yaoling = false; - player.getHistory("useSkill", evt => { - if (evt.skill == "yjtuicheng") tuicheng = true; - if (evt.skill == "yjyaoling") yaoling = true; - }); - return !(tuicheng && yaoling); - }, - content: function () { - player.addTempSkill("yjshicha_limit"); - }, - subSkill: { - limit: { - charlotte: true, - mark: true, - intro: { content: "本回合手牌上限为1" }, - mod: { - maxHandcard: () => 1, - }, - }, - }, - ai: { - neg: true, - }, - }, - yjyongquan: { - audio: 2, - trigger: { player: "phaseJieshuBegin" }, - zhuSkill: true, - filter: function (event, player) { - return ( - player.hasZhuSkill("yjyongquan") && - game.hasPlayer(current => { - return current != player && player.hasZhuSkill(current) && current.group == "qun"; - }) - ); - }, - logTarget: function (event, player) { - return game.filterPlayer(current => { - return current != player && player.hasZhuSkill(current) && current.group == "qun"; - }); - }, - content: function () { - "step 0"; - var targets = lib.skill.yjyongquan.logTarget(trigger, player); - event.targets = targets; - "step 1"; - var target = targets.shift(); - event.target = target; - target - .chooseCard("拥权:是否交给" + get.translation(player) + "一张牌?", "he") - .set("ai", card => { - if (_status.event.goon) return 4.5 - get.value(card); - return 0; - }) - .set("goon", get.attitude(target, player) > 3); - "step 2"; - if (result.bool) { - target.line(player); - target.give(result.cards, player); - } - "step 3"; - if (targets.length) event.goto(1); - }, - }, - //用间beta甘宁的新版 - yjjielve: { - audio: 2, - enable: "phaseUse", - filter: function (event, player) { - return !player.hasSkill("yjjielve_ban"); - }, - viewAs: { name: "chenghuodajie" }, - filterCard: function (card, player) { - if (ui.selected.cards.length) return get.color(card) == get.color(ui.selected.cards[0]); - var cards = player.getCards("hes"); - for (var cardx of cards) { - if (card != cardx && get.color(card) == get.color(cardx)) return true; - } - return false; - }, - position: "hes", - selectCard: 2, - complexCard: true, - check: function (card) { - return 5 - get.value(card); - }, - onuse: function (links, player) { - player.addTempSkill("yjjielve_check"); - }, - subSkill: { - check: { - trigger: { source: "damageSource" }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - return event.card && event.card.name == "chenghuodajie" && event.getParent().skill == "yjjielve"; - }, - content: function () { - player.addTempSkill("yjjielve_ban"); - }, - }, - ban: { charlotte: true }, - }, - }, - //用间beta张飞 - yjmangji: { - audio: 2, - forced: true, - trigger: { - player: ["loseAfter", "damageEnd", "loseHpEnd", "recoverEnd"], - global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], - }, - direct: true, - filter: function (event, player) { - if (player.hp < 1 || !player.countDiscardableCards(player, "h")) return false; - if (["damage", "loseHp", "recover"].includes(event.name)) return true; - var evt = event.getl(player); - if (event.name == "equip" && event.player == player) return !evt || evt.cards.length != 1; - if (!evt || !evt.es.length) return false; - return game.hasPlayer(current => player.canUse("sha", current, false)); - }, - content: function () { - "step 0"; - player.chooseCardTarget({ - prompt: "莽击:弃置一张手牌,视为对一名其他角色使用一张【杀】", - forced: true, - filterCard: lib.filter.cardDiscardable, - filterTarget: function (card, player, target) { - return player.canUse("sha", target, false); - }, - ai2: function (target) { - return get.effect(target, { name: "sha" }, _status.event.player); - }, - }); - "step 1"; - if (result.bool) { - var target = result.targets[0], - cards = result.cards; - player.logSkill("yjmangji", target); - player.discard(cards); - if (player.canUse("sha", target, false)) player.useCard({ name: "sha", isCard: true }, target, false); - } - }, - }, - //用间beta曹洪 - yjlifeng: { - audio: 2, - enable: "phaseUse", - usable: 1, - locked: false, - filter: function (event, player) { - for (var card of ui.discardPile.childNodes) { - if (get.type(card) == "equip") return true; - } - return false; - }, - content: function () { - "step 0"; - var cards = Array.from(ui.discardPile.childNodes).filter(i => get.type(i) == "equip"); - player.chooseButton(["厉锋:获得一张装备牌", cards], cards.length > 0).set("ai", get.buttonValue); - "step 1"; - if (result.bool) { - var card = result.links[0]; - player.gain(card, "gain2"); - } - }, - ai: { - order: 10, - result: { player: 1 }, - effect: { - target: function (card, player, target) { - if (card && get.type(card) == "equip" && _status.event.skill == "_gifting") return 0; - }, - }, - }, - mod: { - cardGiftable: function (card, player) { - return get.type(card) == "equip"; - }, - }, - }, - //用间篇李儒 - yjdumou: { - audio: 2, - forced: true, - mod: { - cardname: function (card, player, name) { - if (player == _status.currentPhase && card.name == "du") return "guohe"; - }, - aiValue: function (player, card, num) { - if (card.name == "du") return get.value({ name: "guohe" }); - }, - }, - init: () => { - game.addGlobalSkill("yjdumou_du"); - }, - onremove: () => { - if (!game.hasPlayer(i => i.hasSkill("yjdumou"), true)) game.removeGlobalSkill("yjdumou_du"); - }, - subSkill: { - du: { - mod: { - cardname: function (card, player, name) { - if (_status.currentPhase && player != _status.currentPhase && _status.currentPhase.hasSkill("yjdumou") && get.color(card) == "black") return "du"; - }, - aiValue: function (player, card, num) { - if (get.name(card) == "du" && card.name != "du") return get.value({ name: card.name }); - }, - }, - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer(i => i.hasSkill("yjdumou"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("yjdumou_du"); - }, - }, - }, - ai: { threaten: 2.1 }, - }, - yjweiquan: { - audio: 2, - enable: "phaseUse", - skillAnimation: true, - animationColor: "soil", - filterTarget: true, - limited: true, - selectTarget: () => [1, game.roundNumber], - contentBefore: function () { - "step 0"; - player.awakenSkill("yjweiquan"); - player.chooseTarget("威权:选择获得牌的角色", true).set("ai", target => { - var att = get.attitude(_status.event.player, target), - num = target.needsToDiscard(targets.filter(i => i != target && i.countCards("h")).length); - if (att > 0 && num <= 2) return 0; - if (att < 0 && target.needsToDiscard(-5)) return -att - Math.sqrt(num); - return att - Math.sqrt(num); - }); - "step 1"; - event.getParent()._yjweiquan = result.targets[0]; - }, - content: function () { - "step 0"; - var targetx = event.getParent()._yjweiquan; - if (target == targetx || !target.countCards("h")) event.finish(); - else target.chooseCard("威权:将一张手牌交给" + get.translation(targetx), true); - "step 1"; - if (result.bool) { - var targetx = event.getParent()._yjweiquan; - target.give(result.cards, targetx); - } - }, - contentAfter: function () { - var targetx = event.getParent()._yjweiquan; - if (targetx.countCards("h") > targetx.hp) { - var next = targetx.phase(); - event.next.remove(next); - event.getParent().after.push(next); - next.player = targetx; - next._noTurnOver = true; - next._triggered = null; - next.setContent(function () { - game.broadcastAll(function () { - if (ui.tempnowuxie) { - ui.tempnowuxie.close(); - delete ui.tempnowuxie; - } - }); - player.phaseDiscard(); - if (!player.noPhaseDelay) game.delayx(); - delete player._noSkill; - }); - } - }, - ai: { - order: 6, - result: { - player: function (player) { - var num = game.countPlayer(current => get.attitude(player, current) < 0 && current.countCards("h")); - if ( - (game.roundNumber < num && player.hp > 2) || - !game.hasPlayer(current => { - return (get.attitude(player, current) > 0 && current.needsToDiscard(num) < 2) || (get.attitude(player, current) < 0 && current.needsToDiscard(-5)); - }) - ) - return -10; - return 1; - }, - target: -1, - }, - }, - }, - yjrenwang: { - audio: 2, - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - for (var card of ui.discardPile.childNodes) { - if (get.color(card) == "black" && get.type(card) == "basic") return true; - } - return false; - }, - content: function () { - "step 0"; - var cards = Array.from(ui.discardPile.childNodes).filter(i => get.color(i) == "black" && get.type(i) == "basic"); - player.chooseButton(["人望:选择一张黑色基本牌", cards], cards.length > 0).set("ai", get.buttonValue); - "step 1"; - if (result.bool) { - var card = result.links[0]; - event.card = card; - player.chooseTarget("选择一名角色获得" + get.translation(card), true).set("ai", target => get.attitude(_status.event.player, target)); - } else event.finish(); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target); - target.gain(card, "gain2"); - } - }, - ai: { - order: 10, - result: { player: 1 }, - }, - }, - //群曹操 - yjxiandao: { - trigger: { player: "giftAccepted" }, - usable: 1, - forced: true, - locked: false, - filter: (event, player) => event.target != player && event.target.isIn(), - logTarget: "target", - content: function () { - "step 0"; - event.target = trigger.target; - event.card = trigger.card; - event.target.markAuto("yjxiandao_block", [get.suit(event.card, false)]); - event.target.addTempSkill("yjxiandao_block"); - "step 1"; - var type = get.type(card, false); - if (type == "trick") player.draw(2); - if (type == "equip") { - if ( - target.countGainableCards(player, "he", function (cardx) { - return cardx != card; - }) > 0 - ) - player - .gainPlayerCard(target, "he", true) - .set("card", card) - .set("filterButton", function (button) { - return button.link != _status.event.card; - }); - if (get.subtype(card, false) == "equip1") target.damage(); - } - }, - subSkill: { - block: { - charlotte: true, - onremove: true, - mod: { - cardEnabled: function (card, player) { - if (player.getStorage("yjxiandao_block").includes(get.suit(card))) return false; - }, - cardRespondable: function (card, player) { - if (player.getStorage("yjxiandao_block").includes(get.suit(card))) return false; - }, - cardSavable: function (card, player) { - if (player.getStorage("yjxiandao_block").includes(get.suit(card))) return false; - }, - }, - mark: true, - intro: { content: "不能使用或打出$牌" }, - }, - }, - }, - yjsancai: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return player.countCards("h") > 0; - }, - content: function () { - "step 0"; - player.showHandcards(); - var hs = player.getCards("h"); - if (hs.length > 1) { - var type = get.type2(hs[0], player); - for (var i = 1; i < hs.length; i++) { - if (get.type(hs[i]) != type) { - event.finish(); - return; - } - } - } - "step 1"; - player.chooseCardTarget({ - prompt: "是否赠予一张手牌?", - filterCard: true, - filterTarget: lib.filter.notMe, - }); - "step 2"; - if (result.bool) { - var target = result.targets[0]; - player.line(target, "green"); - player.gift(result.cards, target); - } - }, - }, - yjyibing: { - trigger: { - player: "gainAfter", - global: "loseAsyncAfter", - }, - direct: true, - filter: function (event, player) { - if (event.getParent().name == "gift") return false; - if (event.getParent("yjyibing").player == player) return false; - var evt = event.getParent("phaseDraw"), - hs = player.getCards("h"), - cards = event.getg(player); - return ( - cards.length > 0 && - (!evt || evt.player != player) && - cards.filter(function (card) { - return hs.includes(card) && game.checkMod(card, player, "unchanged", "cardEnabled2", player) !== false; - }).length == cards.length && - player.hasUseTarget( - { - name: "sha", - cards: event.cards, - }, - false - ) - ); - }, - content: function () { - var cards = trigger.getg(player); - player.chooseUseTarget(get.prompt("yjyibing"), "将" + get.translation(cards) + "当做【杀】使用", "sha", cards, false, "nodistance").logSkill = "yjyibing"; - }, - }, - //龙羽飞 - longyi: { - enable: ["chooseToUse", "chooseToRespond"], - filter: function (event, player) { - if (event.type == "wuxie") return false; - var hs = player.getCards("h"); - if (!hs.length) return false; - for (var i of hs) { - if (game.checkMod(i, player, "unchanged", "cardEnabled2", player) === false) return false; - } - for (var i of lib.inpile) { - if (i != "du" && get.type(i) == "basic" && event.filterCard({ name: i, cards: hs }, player, event)) return true; - if (i == "sha") { - var list = ["fire", "thunder", "ice"]; - for (var j of list) { - if (event.filterCard({ name: i, nature: j, cards: hs }, player, event)) return true; - } - } - } - return false; - }, - chooseButton: { - dialog: function (event, player) { - var vcards = [], - hs = player.getCards("h"); - for (var i of lib.inpile) { - if (i != "du" && get.type(i) == "basic" && event.filterCard({ name: i, cards: hs }, player, event)) vcards.push(["基本", "", i]); - if (i == "sha") { - for (var j of lib.inpile_nature) { - if (event.filterCard({ name: i, nature: j, cards: hs }, player, event)) vcards.push(["基本", "", i, j]); - } - } - } - return ui.create.dialog("龙裔", [vcards, "vcard"]); - }, - check: function (button, player) { - if (_status.event.getParent().type != "phase") return 1; - return _status.event.player.getUseValue({ - name: button.link[2], - nature: button.link[3], - }); - }, - backup: function (links, player) { - return { - audio: "longyi", - popname: true, - viewAs: { name: links[0][2], nature: links[0][3] }, - filterCard: true, - selectCard: -1, - position: "h", - }; - }, - prompt: function (links, player) { - return "将所有手牌当做" + (get.translation(links[0][3]) || "") + get.translation(links[0][2]) + "使用或打出"; - }, - }, - hiddenCard: function (player, name) { - return name != "du" && get.type(name) == "basic" && player.countCards("h") > 0; - }, - ai: { - respondSha: true, - respondShan: true, - skillTagFilter: function (player) { - return player.countCards("h") > 0; - }, - order: 0.5, - result: { - player: function (player) { - if (_status.event.dying) { - return get.attitude(player, _status.event.dying); - } - if (_status.event.type == "respondShan") return 1; - var val = 0, - hs = player.getCards("h"), - max = 0; - for (var i of hs) { - val += get.value(i, player); - if (get.type(i, player) == "trick") max += 5; - } - if (player.hasSkill("zhenjue")) max += 7; - return val <= max ? 1 : 0; - }, - }, - }, - group: "longyi_effect", - subSkill: { - effect: { - trigger: { player: ["useCard", "respond"] }, - forced: true, - charlotte: true, - popup: false, - filter: function (event, player) { - if (event.skill != "longyi_backup") return false; - for (var i of event.cards) { - var type = get.type2(i, player); - if (type == "equip" || type == "trick") return true; - } - return false; - }, - content: function () { - var map = {}; - for (var i of trigger.cards) { - map[get.type2(i, player)] = true; - } - if (map.trick) player.draw(); - if (map.equip && trigger.directHit) trigger.directHit.addArray(game.players); - }, - }, - backup: {}, - }, - }, - zhenjue: { - trigger: { global: "phaseJieshuBegin" }, - filter: function (event, player) { - return player.countCards("h") == 0; - }, - logTarget: "player", - content: function () { - "step 0"; - trigger.player - .chooseToDiscard("he", "弃置一张牌,或令" + get.translation(player) + "摸一张牌") - .set("ai", function (card) { - if (_status.event.goon) return 7 - get.value(card); - return -get.value(card); - }) - .set("goon", get.attitude(trigger.player, player) < 0); - "step 1"; - if (!result.bool) player.draw(); - }, - }, - //群刘备 - jsprende: { - audio: "rerende", - enable: "phaseUse", - filterCard: true, - selectCard: [1, Infinity], - discard: false, - lose: false, - delay: false, - filterTarget: function (card, player, target) { - return player != target; - }, - onremove: true, - check: function (card) { - if (ui.selected.cards.length && ui.selected.cards[0].name == "du") return 0; - if (!ui.selected.cards.length && card.name == "du") return 20; - var player = get.owner(card); - if (ui.selected.cards.length >= Math.max(2, player.countCards("h") - player.hp)) return 0; - if (player.hp == player.maxHp || player.storage.jsprende < 0 || player.countCards("h") <= 1) { - var players = game.filterPlayer(); - for (var i = 0; i < players.length; i++) { - if (players[i].hasSkill("haoshi") && !players[i].isTurnedOver() && !players[i].hasJudge("lebu") && get.attitude(player, players[i]) >= 3 && get.attitude(players[i], player) >= 3) { - return 11 - get.value(card); - } - } - if (player.countCards("h") > player.hp) return 10 - get.value(card); - if (player.countCards("h") > 2) return 6 - get.value(card); - return -1; - } - return 10 - get.value(card); - }, - content: function () { - "step 0"; - var evt = _status.event.getParent("phaseUse"); - if (evt && evt.name == "phaseUse" && !evt.jsprende) { - var next = game.createEvent("jsprende_clear"); - _status.event.next.remove(next); - evt.after.push(next); - evt.jsprende = true; - next.player = player; - next.setContent(function () { - delete player.storage.jsprende; - }); - } - player.give(cards, target); - if (typeof player.storage.jsprende != "number") { - player.storage.jsprende = 0; - } - if (player.storage.jsprende >= 0) { - player.storage.jsprende += cards.length; - if (player.storage.jsprende >= 2) { - var list = []; - if ( - lib.filter.cardUsable({ name: "sha", isCard: true }, player, event.getParent("chooseToUse")) && - game.hasPlayer(function (current) { - return player.canUse("sha", current); - }) - ) { - list.push(["基本", "", "sha"]); - } - for (var i of lib.inpile_nature) { - if ( - lib.filter.cardUsable({ name: "sha", nature: i, isCard: true }, player, event.getParent("chooseToUse")) && - game.hasPlayer(function (current) { - return player.canUse({ name: "sha", nature: i, isCard: true }, current); - }) - ) { - list.push(["基本", "", "sha", i]); - } - } - if ( - lib.filter.cardUsable({ name: "tao", isCard: true }, player, event.getParent("chooseToUse")) && - game.hasPlayer(function (current) { - return player.canUse("tao", current); - }) - ) { - list.push(["基本", "", "tao"]); - } - if ( - lib.filter.cardUsable({ name: "jiu", isCard: true }, player, event.getParent("chooseToUse")) && - game.hasPlayer(function (current) { - return player.canUse("jiu", current); - }) - ) { - list.push(["基本", "", "jiu"]); - } - if (list.length) { - player.chooseButton(["是否视为使用一张基本牌?", [list, "vcard"]]).set("ai", function (button) { - var player = _status.event.player; - var card = { - name: button.link[2], - nature: button.link[3], - isCard: true, - }; - if (card.name == "tao") { - if (player.hp == 1 || (player.hp == 2 && !player.hasShan()) || player.needsToDiscard()) { - return 5; - } - return 1; - } - if (card.name == "sha") { - if ( - game.hasPlayer(function (current) { - return player.canUse(card, current) && get.effect(current, card, player, player) > 0; - }) - ) { - if (card.nature == "fire") return 2.95; - if (card.nature == "thunder" || card.nature == "ice") return 2.92; - return 2.9; - } - return 0; - } - if (card.name == "jiu") { - return 0.5; - } - return 0; - }); - } else { - event.finish(); - } - player.storage.jsprende = -1; - } else { - event.finish(); - } - } else { - event.finish(); - } - "step 1"; - if (result && result.bool && result.links[0]) { - var card = { name: result.links[0][2], nature: result.links[0][3], isCard: true }; - player.chooseUseTarget(card, true); - } - }, - ai: { - fireAttack: true, - order: function (skill, player) { - if (player.hp < player.maxHp && player.storage.jsprende < 2 && player.countCards("h") > 1) { - return 10; - } - return 4; - }, - result: { - target: function (player, target) { - if (target.hasSkillTag("nogain")) return 0; - if (ui.selected.cards.length && ui.selected.cards[0].name == "du") { - if (target.hasSkillTag("nodu")) return 0; - return -10; - } - if (target.hasJudge("lebu")) return 0; - var nh = target.countCards("h"); - var np = player.countCards("h"); - if (player.hp == player.maxHp || player.storage.jsprende < 0 || player.countCards("h") <= 1) { - if (nh >= np - 1 && np <= player.hp && !target.hasSkill("haoshi")) return 0; - } - return Math.max(1, 5 - nh); - }, - }, - effect: { - target: function (card, player, target) { - if (player == target && get.type(card) == "equip") { - if (player.countCards("e", { subtype: get.subtype(card) })) { - if ( - game.hasPlayer(function (current) { - return current != player && get.attitude(player, current) > 0; - }) - ) { - return 0; - } - } - } - }, - }, - threaten: 0.8, - }, - }, - //曹安民 - nskuishe: { - enable: "phaseUse", - usable: 1, - filterTarget: function (card, player, target) { - return target != player && target.countCards("he") > 0; - }, - content: function () { - "step 0"; - player.choosePlayerCard(target, "he", true).set("ai", get.buttonValue); - "step 1"; - if (result.bool) { - var card = result.cards[0]; - event.card = card; - player - .chooseTarget("将" + get.translation(target) + "的" + (get.position(card) == "h" && !player.hasSkillTag("viewHandcard", null, target, true) ? "手牌" : get.translation(card)) + "交给一名角色", true, function (target) { - return target != _status.event.getParent().target; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); - if (_status.event.du) { - if (target.hasSkillTag("nodu")) return 0; - return -att; - } - if (target.hasSkillTag("nogain")) return 0.1; - if (att > 0) { - return att + Math.max(0, 5 - target.countCards("h")); - } - return att; - }) - .set("du", event.card.name == "du"); - } else event.finish(); - "step 2"; - if (result.bool) { - var target2 = result.targets[0]; - target.line(target2, "green"); - target2.gain(target, card, "giveAuto").giver = player; - } else event.finish(); - "step 3"; - target - .chooseToUse( - function (card, player, event) { - if (get.name(card) != "sha") return false; - return lib.filter.filterCard.apply(this, arguments); - }, - "是否对" + get.translation(player) + "使用一张杀?" - ) - .set("targetRequired", true) - .set("complexSelect", true) - .set("filterTarget", function (card, player, target) { - if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; - return lib.filter.filterTarget.apply(this, arguments); - }) - .set("sourcex", player); - }, - ai: { - order: 6, - expose: 0.2, - result: { - target: -1.5, - player: function (player, target) { - if (!target.canUse("sha", player)) return 0; - if (target.countCards("h") == 1) return 0.1; - if (player.hasShan()) return -0.5; - if (player.hp <= 1) return -2; - if (player.hp <= 2) return -1; - return 0; - }, - }, - }, - }, - //文和乱武 - nsyangwu: { - enable: "phaseUse", - usable: 1, - filterCard: { suit: "heart" }, - filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > player.countCards("h"); - }, - filter: function (event, player) { - var info = lib.skill.nsyangwu; - return ( - player.countCards("h", info.filterCard) && - game.hasPlayer(function (target) { - return info.filterTarget(null, player, target); - }) - ); - }, - check: function (card) { - var num = 0; - var player = _status.event.player; - game.countPlayer(function (current) { - if (current != player && get.attitude(player, current) < 0) num = Math.max(num, current.countCards("h") - player.countCards("h")); - }); - return Math.ceil((num + 1) / 2) * 2 + 4 - get.value(card); - }, - content: function () { - var num = Math.ceil((target.countCards("h") - player.countCards("h")) / 2); - if (num) player.gainPlayerCard(target, true, "h", num, "visible"); - }, - ai: { - order: 4, - result: { - target: function (player, target) { - return player.countCards("h") - target.countCards("h"); - }, - }, - }, - }, - nslulve: { - enable: "phaseUse", - usable: 1, - filter: function (event, player) { - return game.hasPlayer(function (current) { - return current.countCards("e") > 0 && current.countCards("e") <= player.countCards("he"); - }); - }, - filterCard: function () { - if (ui.selected.targets.length) return false; - return true; - }, - position: "he", - selectCard: [1, Infinity], - complexSelect: true, - complexCard: true, - filterTarget: function (card, player, target) { - return target != player && target.countCards("e") > 0 && ui.selected.cards.length == target.countCards("e"); - }, - check: function (card) { - var player = _status.event.player; - if ( - game.hasPlayer(function (current) { - return current != player && current.countCards("e") > 0 && ui.selected.cards.length == current.countCards("e") && get.damageEffect(current, player, player) > 0; - }) - ) - return 0; - switch (ui.selected.cards.length) { - case 0: - return 8 - get.value(card); - case 1: - return 6 - get.value(card); - case 2: - return 3 - get.value(card); - default: - return 0; - } - }, - content: function () { - target.damage("nocard"); - }, - ai: { - damage: true, - order: 2, - result: { - target: function (player, target) { - return get.damageEffect(target, player); - }, - }, - expose: 0.3, - }, - }, - nsfeixiong: { - trigger: { player: "phaseUseBegin" }, - direct: true, - filter: function (event, player) { - return ( - player.countCards("h") > 0 && - game.hasPlayer(function (current) { - return current != player && player.canCompare(current); - }) - ); - }, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("nsfeixiong"), function (card, player, target) { - return player != target && player.canCompare(target); - }) - .set("ai", function (target) { - var player = _status.event.player; - var hs = player.getCards("h").sort(function (a, b) { - return b.number - a.number; - }); - var ts = target.getCards("h").sort(function (a, b) { - return b.number - a.number; - }); - if (!hs.length || !ts.length) return 0; - if (hs[0].number > ts[0].number) return get.damageEffect(target, player, player); - return 0; - }); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("nsfeixiong", target); - if (get.mode() !== "identity" || player.identity !== "nei") player.addExpose(0.2); - player.chooseToCompare(target); - } else event.finish(); - "step 2"; - if (!result.tie) { - var targets = [player, target]; - if (result.bool) targets.reverse(); - targets[0].damage(targets[1]); - } - }, - }, - nscesuan: { - trigger: { player: "damageBegin3" }, - forced: true, - content: function () { - "step 0"; - trigger.cancel(); - event.lose = player.loseMaxHp(); - "step 1"; - if (event.lose && event.lose.loseHp) player.draw(); - }, - ai: { - halfneg: true, - filterDamage: true, - skillTagFilter: function (player, tag, arg) { - if (tag === "filterDamage" && arg && arg.player) { - if (arg.player.hasSkillTag("jueqing", false, player)) return false; - } - }, - }, - }, - //S贾诩 - nsyice: { - trigger: { - player: "loseAfter", - global: ["cardsDiscardAfter", "loseAsyncAfter"], - }, - filter: function (event, player) { - if (event.name != "cardsDiscard") { - if (event.type != "discard") return false; - var evt = event.getl(player); - return evt.cards2 && evt.cards2.filterInD("d").length > 0; - } else { - var evt = event.getParent(); - if (evt.name != "orderingDiscard" || !evt.relatedEvent || evt.relatedEvent.player != player || !["useCard", "respond"].includes(evt.relatedEvent.name)) return false; - return event.cards.filterInD("d").length > 0; - } - }, - forced: true, - content: function () { - "step 0"; - var evt = trigger.getParent().relatedEvent; - if ((trigger.name == "discard" && !trigger.delay) || (evt && evt.name == "respond")) game.delayx(); - "step 1"; - var cards; - if (trigger.getl) cards = trigger.getl(player).cards2.filterInD("d"); - else cards = trigger.cards.filterInD("d"); - if (cards.length == 1) event._result = { bool: true, links: cards }; - else { - var dialog = ["遗策:选择要放置的卡牌", '